
Если надебиан 7сервер (wheezy), работающий на размещенной виртуальной машине и обновленном cron
демоне, есть ошибка, из-за которой cron перестал работать без очевидной причины. Поскольку это произошло только один раз с тех пор, его трудно отладить.
Как можно гарантировать, что cron автоматически перезапустится в случае повторного сбоя и отправит оповещение по электронной почте?
решение1
Вы всегда можете проверитьмонитпроект.
Вы можете перезапустить службы и поддерживать их в рабочем состоянии.
Если у вас нет возможности исправить cron, как предлагалось в комментариях.
решение2
Разве я не могу запустить что-то вроде daemontools для мониторинга и перезапуска процесса?
Да, действительно; и на некоторых машинах я делаю именно это. "Что-то вроде daemontools" на самом деле является менеджером сервисов изпакет едыНо другие члены семейства daemontools более чем способны контролировать GNU cron. (Vixie cron — это другое дело, но вы сказали Debian.)
GNU cron — одна из самых простых служб для запуска под управлением daemontools family service management. Она есть в коллекции скриптов запуска Gerrit Pape, как и в коллекции пакетов служб, которая сопровождает набор инструментов nosh.
Тем не менее, я не припомню, чтобы мне когда-либо приходилось перезапускать GNU cron.потому что он разбился.
С точки зрения захвата, управление услугами — это не просто автоматический перезапуск. Этотакжео ведении журнала и контроле ресурсов, оба из которых имеют отношение к задачедиагностика почемуУ вас происходит сбой GNU cron.
Диагностика проблемы будет включать в себя такие вещи, как:
- Редактирование
run
программы дляsoftlimit
включения дампов ядра. - Редактирование
restart
сценария (или эквивалента)…- … чтобы проверить, завершился ли демон или был ли он завершен сигналом.
- …для сбора керновых отвалов.
- … для подачи оповещений и отправки уведомлений по почте. (Однажды я настроил
restart
скрипт, который отправлял мне по почте последние несколько строк вlog/main/current
случае сбоя/прекращения работы.) - … для настройки ограничения скорости перезапуска.
- Чтение индивидуального журнала GNU cron и собственного журнала менеджера служб для определения того, когда и как часто перезапускался демон, а также какие сообщения об ошибках он вывел (если таковые имеются).
дальнейшее чтение
- Джонатан де Бойн Поллард (2015).Семейство daemontools. Часто задаваемые ответы.
- Геррит Папе.Пакеты Debian
- https://unix.stackexchange.com/a/283132/5132
- https://unix.stackexchange.com/a/283580/5132
решение3
crond
Поскольку через него нельзя осуществлять мониторинг, crond
я бы сделал так:
echo "while true; do if ! (ps aux |grep crond |grep -v grep); then /etc/init.d/crond start; fi && sleep 5; done &" >> /etc/rc.local
решение4
Не нужно устанавливать daemontools
, runit
, supervise
, и т. д. Насколько бы полезными ни были эти инструменты, они охватывают случаи использования, которые вам обычно не нужны для одного только cron. То, что вам просто нужно, можно легко обработать с помощью init. Добавьте в /etc/inittab:
cron:2345:respawn:/usr/sbin/crond -n
Сначала убедитесь, crond
что поддерживает эту -n
опцию. Это говорит ему не разветвляться и оставаться на переднем плане. ** Обязательно отключите crond из скриптов rc **.
/usr/lib/lsb/remove_initd /etc/init.d/crond
Если по какой-то причине crond выводит данные в stdout или stderr, вам нужно будет написать скрипт-обертку для обработки этого вывода и запустить скрипт-обертку. Сохраняйте этот скрипт простым:
#!/bin/sh
#crond-wrapper.sh
exec crond -n &>>/var/log/crond
В качестве альтернативы вы можете изменить существующий упакованный init.d/crond
скрипт на тот, который вызывается crond -n
в цикле while. Но в этом случае вам придется быть умным, сохраняя pid
для последующего использования этим скриптом.