Слыхал про with-lock-ex, flock, lckdo?
Если коротко, это штуки, которые не дают запустить второй экземпляр скрипта/программы, если первый ещё работает.
Всё это и многое другое входит в пакет moreutils, в убунтах из коробки я их не нашел, пришлось ставить. Но это детали. В этот пакет входит еще дюжина полезных хуёвин.
Например (нажми на спойлер):
Вернемся к lckdo (Lock and Do). Это обёртка вокруг flock. Как и написал выше, оно не позволяет запуститься второму экземпляру программы/скрипта.
Допустим у тебя что-то запустилось по крону, не успело завершиться и через промежуток снова запускается. Наплодилось 100500 процессов, сервак встал раком, а потом и тебя поставили раком.
lckdo — ставит блокировку на файл, если блокировка прошла — выполняет указанную команду, если не удалось — завершает выполнение (по умолчанию).
Давай на практике!
В первом терминале запускаем:
lckdo /tmp/bashdays.lock bash -c 'echo start; sleep 60; echo done'
Во втором терминале запускаем:
lckdo /tmp/bashdays.lock echo "Hello bashdays"
И получаем: lckdo: lockfile /tmp/bashdays.lock’ is already locked
По умолчанию lckdo ничего не ждет, если нужно, чтобы он ждал до освобождения блокировки, добавляем -w.
lckdo -w /tmp/bashdays.lock echo "I'm free"
Теперь когда файл /tmp/bashdays.lock будет отпущен, отработает команда и выведет на экран I’m free.
Как lckdo работает с lock-файлом.
Файл
/tmp/bashdays.lockсам по себе ничего не блокирует.Блокировку держит процесс, который открыл файл и вызвал
flock/lckdoна него.Когда процесс завершается — блокировка автоматически снимается.
/tmp/bashdays.lock остаётся на диске — он больше не заблокирован, и lckdo снова сможет его использовать.Всё логично, вот еще один пример с кроном:
* * * * * lckdo /tmp/bashdays.lock /usr/local/bin/bashdays.sh
Скрипт не будет запущен, если предыдущий запуск не завершился.
Такие дела. Бери на вооружение, возможно где-то в хозяйстве сгодится.








Комментарии