Итак, я пытаюсь настроить задание cron в качестве своего рода сторожевого пса для созданного мной демона. Если демон выдает ошибку и выходит из строя, я хочу, чтобы задание cron периодически перезапускало его ... Я не уверен, насколько это возможно, но я прочитал пару руководств по cron и не смог найти ничего, что могло бы делать то, что я ищу ...
Мой демон запускается из сценария оболочки, поэтому я просто ищу способ запустить задание cron, ТОЛЬКО если предыдущий запуск этого задания еще не выполняется.
Я нашел этот пост , который предлагает решение того, что я пытаюсь сделать с помощью файлов блокировки, не я не уверен, есть ли лучший способ сделать это ...
Спасибо за вашу помощь.
grep -v grep | grep doctype.php
тебя можно сделатьgrep [d]octype.php
.&
если скрипт запускает cron.Использование
flock
. Это новое. Лучше.Теперь вам не нужно писать код самостоятельно. Ознакомьтесь с другими причинами здесь: https://serverfault.com/a/82863
источник
setlock
,s6-setlock
,chpst
, Иrunlock
в их неблокирующих режимах альтернативы, которые доступны на более , чем просто Linux. unix.stackexchange.com/a/475580/5132Как утверждали другие, запись и проверка файла PID - хорошее решение. Вот моя реализация на bash:
источник
>
«против>>
». Извини за это.[ -e "${PIDFILE}" ]
". Если нет, то он запускает программу в фоновом режиме, записывает свой PID в файл ("echo $! > "${PIDFILE}"
") и exit. Если вместо этого PID-файл существует, то сценарий проверит ваши собственные процессы ("ps -u $(whoami) -opid=
") и увидит, запущен ли вы один с тем же PID ("grep -P "^\s*$(cat ${PIDFILE})$"
"). Если нет, то он запустит программа, как и раньше, перезапишите файл PID новым идентификатором PID и выйдите. Я не вижу причин изменять сценарий; не так ли?Удивительно, что про run-one никто не упомянул . Я решил с этим свою проблему.
затем добавьте
run-one
перед скриптом crontabПосмотрите этот ответ на askubuntu SE. Вы также можете найти ссылку на подробную информацию.
источник
Не пытайтесь делать это через cron. Пусть cron запустит скрипт, что бы ни случилось, а затем пусть скрипт решит, запущена ли программа, и запустит ее при необходимости (обратите внимание, что для этого вы можете использовать Ruby или Python или ваш любимый язык сценариев)
источник
Вы также можете сделать это как однострочник прямо в вашем crontab:
источник
ps -ef|grep [c]ommand
-eq 0] && <command>, где перенос первой буквы вашей команды в скобки исключает ее из результатов grep.[ "$(ps -ef|grep [c]ommand|wc -l)" -eq 0 ] && <command>
[ $(grep something | wc -l) -eq 0 ]
это действительно окольный способ писать! grep -q something
. Так что вы хотите простоps -ef | grep '[c]ommand' || command
grep -c
.)Я делаю это, когда запускаю скрипты php:
Кронтаб:
Код php:
Эта команда ищет в списке системных процессов текущее имя файла php, если оно существует, счетчик строк (wc -l) будет больше единицы, потому что сама команда поиска содержит имя файла
поэтому, если вы запускаете php crons, добавьте указанный выше код в начало вашего php-кода, и он будет запускаться только один раз.
источник
В продолжение ответа Эрлза вам понадобится сценарий-оболочка, который при запуске создает файл $ PID.running и удаляет его по окончании. Скрипт-оболочка вызывает скрипт, который вы хотите запустить. Оболочка необходима в случае сбоя или ошибки целевого скрипта, файл pid удаляется.
источник
При этом
lockrun
вам не нужно писать сценарий оболочки для вашей работы cron. http://www.unixwiz.net/tools/lockrun.htmlисточник
Я бы рекомендовал использовать существующий инструмент, такой как monit , он будет отслеживать и автоматически перезапускать процессы. Существует более подробная информация доступна здесь . Он должен быть легко доступен в большинстве дистрибутивов.
источник
Этот меня никогда не подводил:
one.sh :
cron работа :
источник
ОБНОВЛЕНИЕ .. лучший способ использовать flock:
источник
Я бы предложил следующее в качестве улучшения ответа rsanden (я бы опубликовал как комментарий, но у меня недостаточно репутации ...):
Это позволяет избежать возможных ложных совпадений (и накладных расходов на grepping), а также подавляет вывод и полагается только на статус выхода ps.
источник
ps
команда будет соответствовать PID для других пользователей в системе, а не только для вашего собственного. Добавление "-u
" кps
команде изменяет способ работы статуса выхода.Достаточно простого настраиваемого php. Не нужно путать со сценарием оболочки.
Предположим, вы хотите запустить php /home/mypath/example.php, если он не запущен
Затем используйте следующий настраиваемый скрипт php для выполнения той же работы.
создать следующий /home/mypath/forever.php
Затем в вашем cron добавьте следующее
источник
Если вы собираетесь пойти по этому пути, подумайте об использовании pgrep (если доступно), а не ps, передаваемого через grep. Хотя лично у меня много пробега из скриптов вида
Хотя это может дать сбой и хроны рабочих мест являются часто лучшим способом для основных вещей. Еще одна альтернатива.
источник
Документы: https://www.timkay.com/solo/
пример
источник