with-lock-ex, flock, lckdo?Если коротко, это штуки, которые не дают запустить второй экземпляр скрипта/программы, если первый ещё работает.
ㅤ
Всё это и многое другое входит в пакет
moreutils, в убунтах из коробки я их не нашел, пришлось ставить. Но это детали. В этот пакет входит еще дюжина полезных хуёвин.Например (нажми на спойлер):
sudo apt install moreutils
chronic — показывает вывод команды, только если она завершилась с ошибкой.
combine — логические операции над двумя файлами (как `sort` + `comm`, но проще).
errno — выводит описание кода ошибки (EACCES 13 Permission denied).
ifdata — dыводит информацию о сетевых интерфейсах в скриптабельном виде.
ifne — выполняет команду только если предыдущая команда что-то вывела (if-not-empty).
isutf8 — проверяет, является ли файл валидным UTF-8.
и так далее…
Вернемся к
lckdo (Lock and Do). Это обёртка вокруг flock. Как и написал выше, оно не позволяет запуститься второму экземпляру программы/скрипты.Допустим у тебя что-то запустилось по крону, не успело завершиться и через промежуток снова запускается. Наплодилось 100500 процессов, сервак встал раком, а потом и тебя поставили раком.
lckdo — cтавит блокировку на файл, если блокировка прошла — выполняет указанную команду, если не удалось — завершает выполнение (по умолчанию).Давай на практике!
В первом терминале запускаем:
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-файлом.
1. Файл
/tmp/bashdays.lock сам по себе ничего не блокирует.2. Блокировку держит процесс, который открыл файл и вызвал
flock/lckdo на него.3. Когда процесс завершается — блокировка автоматически снимается.
Даже если файл
/tmp/bashdays.lock остаётся на диске — он больше не заблокирован, и lckdo снова сможет его использовать.Всё логично, вот еще одни пример с кроном:
* * * * * lckdo /tmp/bashdays.lock /usr/local/bin/bashdays.sh
Скрипт не будет запущен, если предыдущий запуск не завершился.
Такие дела. Бери на вооружение, возможно где-то в хозяйстве сгодится.
🛠 #linux
—
✅ @bashdays ✅ @linuxfactory ✅ @blog