Назад | Перейти на главную страницу

Ошибка cron CentOS 5 при остановке / запуске службы в crontab

Как лучше всего остановить / запустить определенную службу по расписанию с помощью 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 гарантирует, что служба также будет работать в это время (например, после перезагрузки в середине дня) ...