Как лучше всего остановить / запустить определенную службу по расписанию с помощью cron?
Я пробовал бежать service servicename stop
в работе cron, но это не сработало, поэтому переключился на /etc/init.d/servicename
0 19 * * * /etc/init.d/servicename stop >/dev/null 2>&1
0 7 * * * /etc/init.d/servicename start >/dev/null 2>&1
Кажется, это работает, но пока не уверен, насколько последовательно.
Но странно то, что я получаю письмо от cron со следующей ошибкой:
/bin/sh: line 1: 20178 Terminated /etc/init.d/servicename start > /dev/null 2>&1
Кажется, я получаю эту ошибку только при запуске службы. Остановка вроде в порядке.
Также я думал, что >/dev/null 2>&1
должен подавлять рассылку уведомлений по электронной почте. Хотя в данном случае я рад, что этого не произошло.
Кто-нибудь знает лучший способ останавливать / запускать службы по расписанию, надеюсь, используя cron?
Кто-нибудь знает, о чем эта ошибка?
Спасибо
Вы должны уметь использовать /sbin/service
... и на самом деле это хорошая привычка, поскольку в следующем выпуске RHEL / CentOS / etc, вероятно, будет использоваться systemd
вместо наследия /etc/init.d
скрипты. Если звонить /sbin/service
не работает, вы можете просмотреть все сообщения об ошибках, которые генерирует команда.
В Terminated
ошибка, которую вы получаете, может быть ошибочным скриптом управления службой ... если он делает что-то вроде killall servicename
он может непреднамеренно убить сценарий управления, что может привести к этой ошибке. Вы по-прежнему видите сообщение об ошибке, потому что это сообщение об ошибке исходит из оболочки, которая cron
начинает выполнять вашу команду, а не из самой команды. Если это то, что здесь происходит, вы можете взглянуть на сценарий инициализации и посмотреть, сможете ли вы решить проблему.
При отладке ошибок иногда рекомендуется перенаправить stdout
и stderr
в файл, а не /dev/null
(хотя в данном случае это не поможет).
Да, лучший способ справиться с этим - использовать утилита управления заданиями, такая как Monit. Он доступен для CentOS и представляет собой чистый способ гарантировать, что ваши демоны работают, когда они нужны, и может использоваться для запуска / остановки отдельных или групп служб по расписанию (через cron) ... Пример, в котором я вижу cron провалиться сквозь трещины - это когда что-то происходит в служебном окне (падение приложения и т. д.)
Вот пример со службой печати CUPS ...
Где-то в файле конфигурации Monit я бы имел раздел, определяющий службу CUPS, включая ее PID и команды запуска и остановки.
check process cups
with pidfile "/var/run/cupsd.pid"
start program = "/sbin/service cups start"
stop program = "/sbin/service cups stop"
Бег monit status
Process 'cups'
status Running
monitoring status Monitored
pid 2357
parent pid 1
uptime 8d 6h 43m
.
.
data collected Mon, 13 Aug 2012 09:07:03
Бег monit stop cups
останавливает службу ...
Process 'cups'
status Not monitored
monitoring status Not monitored
data collected Mon, 13 Aug 2012 09:08:03
monit start cups
запускает это. Обычно я добавляю команды запуска и остановки монитора в crontab для обработки запуска и завершения работы приложения. Monit гарантирует, что служба также будет работать в это время (например, после перезагрузки в середине дня) ...