№ 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: God is not dead. He is alive and well and working on a much less ambitious project.
Очень кривое решение. Если таск умрет или питание вырубится, этот лок файл останется и не даст запуститься новым заданиям. Гораздо лучше использовать мюьтекс. Для 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), который делает примерно то же самое, но без рейс кондишна, без проблем с удалением файла и с сохранением кода завершения. По желанию с ожиданием освобождения лока.