INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / RSS / GPG

Запуск cron задания с проверкой на копии

№ 2089 В разделе Sysadmin от April 23rd, 2010,
В подшивках: ,

На одном из моих серверов появилась небольшая проблема с производительностью – некоторые задания в 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, --timeout      wait 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 таска, второй параметр является непосредственно командой. Если команда состоит из пробелов и прочих спец символов, то следует применить кавычки и символы экранирования.

6 комментариев »

6 responses to “Запуск cron задания с проверкой на копии”

  1. ud says:

    Очень кривое решение. Если таск умрет или питание вырубится, этот лок файл останется и не даст запуститься новым заданиям. Гораздо лучше использовать мюьтекс. Для sh есть вот например: http://sh-mutex.sourceforge.net/

  2. 21h says:

    могу поспорить на ящик пива, что не останется. не знаю как у вас в фрибсдях, а у нас в линуксах /tmp не записывается на винт.

  3. ud says:

    Ну это как подмонтируешь 🙂 По дефолту у меня:
    /dev/ad0s1e /home ufs rw 2 2
    /dev/ad0s1f /tmp ufs rw 2 2
    так что наверно записывается. Начет линукса не знал, если так, то круто.

  4. 21h says:

    tmpfs используется. наверняка такое и в бсдях есть.

  5. bioex says:

    tmpfs для /tmp по дефолту нигде в линуксах не используется (речь о популярных дистрах). Просто в Debian, например, /tmp зачищается при загрузке (см. /etc/rcS.d/S12mountall-bootclean.sh)

  6. ls says:

    Во FreeBSD есть lockf(1), который делает примерно то же самое, но без рейс кондишна, без проблем с удалением файла и с сохранением кода завершения. По желанию с ожиданием освобождения лока.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Облачная платформа

Микроблог перейти


🇷🇺 © Vladimir Smagin, 2005-2023. Копирование материалов без разрешения запрещено. GPG *
Яндекс.Метрика

Fortune cookie: God is not dead. He is alive and well and working on a much less ambitious project.