В мире нет ничего идеального, и в среде Linux тоже. Редко, но все же возникает ситуация, когда какой-нибудь активно разрабатываемый сервис падает по только ему известным причинам. И пока не вышла новая версия, пока не обновились библиотеки, ничего не остается делать, как настраивать сторожевого пса (watchdog).
Watchdog обычно должен делать простую вещь: следить, выполняется ли в данный момент какой-либо процесс, и если нет, то пытаться его запустить.
Простейший пример
В простейшем случае код Watchdog-а через Cron может выглядеть так:
* * * * * [ `ps -ef|grep -v grep|grep <stringdInPs>` -eq 0 ] && <commandRun>
Этот код размещается в файле crontab.
где:
- <stringdInPs> - это строка, которая должна присутсвовать в выводе команды ps -ef. Если таковой не окажется (вывод будет нуливой -eg 0), то выполнится команда:
- <commandRun> - это команда, которая запускает процесс.
Зачастую <stringdInPs> и <commandRun> содержат одну и ту же команду.
Сравнение вывода команды с заранее известной строкой
Сравнение вывода команды с заданным строковым значением можно организовать так:
* * * * * [[ "`service zoneminder status`" == "ZoneMinder is stopped" ]] && service zoneminder start
Подводные камни: этот код будет работать только в случае, если внутри Cron у вас используется командная оболочка Bash. Узнать, какая оболочка используется в Cron, можно заглянув в файл /etc/crontab, и посмотрев на переменную SHELL:
SHELL=/bin/sh
Для оболочки sh эквивалентный код будет выглядеть так:
* * * * * test "`service zoneminder status`" = "ZoneMinder is stopped" && service zoneminder start