У меня есть сценарий на основе PHP, который останавливает выполнение двух одинаковых процессов (через crontab), в CentOS я проверил запущенный процесс следующим образом:
if(file_exists("/proc/{$pid}" )) {
Однако похоже, что FreeBSD не поддерживает эту структуру, есть ли подобное место, которое я могу проверить? Или мне нужно выполнить команду оболочки?
Самый простой способ блокировки заданий cron (от параллельного выполнения) - это замок (1) команда. Он доступен во FreeBSD и Mac OS X. Linux имеет очень похожие flock
команда (но параметры разные).
E. g.
* * * * * lockf -st0 /tmp/foo.lock /path/to/foo-script
Если foo-script будет работать больше одной минуты, следующий запускаться не будет. -t0
значит не ждите блокировки, просто выйдите.
При желании можно дождаться блокировки, e, g,
@hourly lockf -st1800 /tmp/foo.lock /path/to/foo-script
будет ждать 30 минут для блокировки и, если блокировка все еще удерживается, выйдет.
Если длительный процесс является ненормальной ситуацией и указывает на некоторую ошибку, полезно отправить сообщение об ошибке администратору:
MAILTO=cron-mail@example.org
@daily lockf -t0 /tmp/foo.lock /path/to/foo-script
(опция -s "тихо" удалена, т.к. требуется сообщение об ошибке).