Kaptain.
Telegram /
LinkedIn /
Email /
GIT /
RSS /
GPG /
Заказ печатных плат

№ 2089 В разделе
Sysadmin
от April 23rd, 2010,
В подшивках: Cron, Linux
На одном из моих серверов появилась небольшая проблема с производительностью – некоторые задания в cron не успевали завершиться прежде, чем запустится новое. Скрипт предельно прост и предназначет исключительно для предотвращения запуска копии программы. В качестве бонуса ведется сбор информации какой cron когда запущен и закончен.
Вариант №1 Штатной программой flock из Ubuntu
Не даст запустить вторую копию
root@boroda:~# flock -xn /run/lock/mc.lock -c mc
Даст запустить вторую копию, будет ждать пока уже запущенное задание не отработает
root@boroda:~# flock -x /run/lock/mc.lock -c mc
Options: -s, --shared get a shared lock -x, --exclusive get an exclusive lock (default) -u, --unlock remove a lock -n, --nonblock fail rather than wait -w, --timeoutwait for a limited amount of time -E, --conflict-exit-code exit code after conflict or timeout -o, --close close file descriptor before running command -c, --command run a single command string through the shell --verbose increase verbosity
Вариант №2 Мой костыль
#!/bin/sh
NAME=$1
CMD=$2
LOGDIR="/var/cronlogs"
if [ -f /run/lock/$NAME.lock ]; then
echo $NAME " still works!"
else
touch /run/lock/$NAME.lock
echo "Started "$NAME" at" `date` >> $LOGDIR/$NAME.txt
$CMD
echo "Finished "$NAME" at" `date` >> $LOGDIR/$NAME.txt
rm /run/lock/$NAME.lock
fi
Как им пользоваться: run_cron.sh my_super_task /usr/bin/my_super_program
Первый параметр это название cron таска, второй параметр является непосредственно командой. Если команда состоит из пробелов и прочих спец символов, то следует применить кавычки и символы экранирования.
Fortune cookie: There was a young girl of Newcastle Whose charms were declared universal. While one man in front Wired into her cunt, Another was engaged at her arsehole.
Очень кривое решение. Если таск умрет или питание вырубится, этот лок файл останется и не даст запуститься новым заданиям. Гораздо лучше использовать мюьтекс. Для sh есть вот например: http://sh-mutex.sourceforge.net/
могу поспорить на ящик пива, что не останется. не знаю как у вас в фрибсдях, а у нас в линуксах /tmp не записывается на винт.
Ну это как подмонтируешь 🙂 По дефолту у меня:
/dev/ad0s1e /home ufs rw 2 2
/dev/ad0s1f /tmp ufs rw 2 2
так что наверно записывается. Начет линукса не знал, если так, то круто.
tmpfs используется. наверняка такое и в бсдях есть.
tmpfs для /tmp по дефолту нигде в линуксах не используется (речь о популярных дистрах). Просто в Debian, например, /tmp зачищается при загрузке (см. /etc/rcS.d/S12mountall-bootclean.sh)
Во FreeBSD есть lockf(1), который делает примерно то же самое, но без рейс кондишна, без проблем с удалением файла и с сохранением кода завершения. По желанию с ожиданием освобождения лока.