Можно ли использовать "служебный старт" выскочки внутри задания cron?


TLDR ; можно ли создать задание cron, которое запускает службу имя_службы Начало ? Но как?

Содержание моего

sudo crontab -e

Это:

45 23 * * * service bormarise_celery_daemon start

Это обычно выполняется на терминале как корень или сервер:

service bormarise_celery_daemon start
start: Job is already running: bormarise_celery_daemon

Но вместо этого крон дал следующую ошибку:

bormarise_celery_daemon: unrecognized service
1 6

1 ответ:

Tl; dr

Вам нужно добавить /sbin в cron'S PATH, чтобы скрипт service мог найти initctl. Для этого добавьте в верхнюю часть кронтаба следующее определение:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Вы все еще можете столкнуться с проблемами с cron электронной почтой, так как initctl завершается со статусом 1 (fail), если задание, которое вы пытаетесь запустить, уже запущено. Вы можете обойти это с помощью чего-то вроде:

45 23 * * * service bormarise_celery_daemon status | grep -q running || service bormarise_celery_daemon start

Несмотря на то, что он немного длинноват, он должен пытаться выполнить команду start только в том случае, если служба bormarise_celery_daemon не является бегущий.

Service vs initctl

В то время как команда service пытается управлять заданиями выскочек, это не фактическая функция управления выскочками - это будет initctl и соответствующий набор команд короткой руки (, т. е., start, stop, и т.д.[67]}). Все скрипты Upstart находятся в /sbin/.

Команда service пытается облегчить людям распространение сервисов как между сценариями Upstart, так и между классическими сценариями в стиле SysV. Таким образом, вы можете использовать один интерфейс (скрипт service) для управления службами из обеих систем.

Углубляясь в служебный скрипт

Если вы просмотрите фактический источник скрипта service (это просто скрипт Bash) на Ubuntu 14.04, вы увидите:

if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
   && initctl version | grep -q upstart
then
   # Upstart configuration exists for this job and we're running on upstart
   case "${ACTION}" in
      start|stop|status|reload)
         # Action is a valid upstart action
         exec ${ACTION} ${SERVICE} ${OPTIONS}
      ;;
      restart)
         # Map restart to the usual sysvinit behavior.
         stop ${SERVICE} ${OPTIONS} || :
         exec start ${SERVICE} ${OPTIONS}
      ;;
      force-reload)
         # Upstart just uses reload for force-reload
         exec reload ${SERVICE} ${OPTIONS}
      ;;
   esac
fi

Условие открытия:

  1. проверяет, является ли указанная вами служба (в вашем случае: bormarise_celery_daemon) работой выскочки. Задания выскочек входят в /etc/init/ с расширением .conf.
  2. если это так, то скрипт service проверит, может ли он работать. initctl.
  3. если это возможно, то скрипт service удостоверится, что initctl является достаточно новой версией.

Если все это верно, то скрипт service попытается использовать соответствующую команду initctl для запуска задания Upstart. Например:

service bormarise_celery_daemon start

Переводится как:

start bormarise_celery_daemon

, что (в основном) эквивалентно:

initctl start bormarise_celery_daemon

Однако , если любое из этих условий неверно, сценарий service предполагает, что вы пытаетесь запустить сценарий в стиле SysV. Это просто скрипты Bash, расположенные в /etc/init.d/. Однако, если такой сценарий не существует, он завершится с сообщением об ошибке unrecognized service.

Складывание кусочков вместе

Значение по умолчанию PATH для cron содержит только /bin/ и /usr/bin/. Это означает, что он не включает /sbin/, где находится исполняемый файл initctl. это означает, что cron не сможет выполнить initctl.

Когда cron запускает ваш crontab, скрипт service может найти вашу работу выскочки, но это не способен выполнить команду initctl, поэтому он пропускает попытку запустить ваш сервис через Upstart (, т. е., initctl). Вместо этого он пытается найти скрипт в стиле SysV в /etc/init.d/. Поскольку этот сценарий не существует, скрипт service сдается и печатает ваше сообщение об ошибке.

Если вы переопределите cron's default PATH с одним включением /sbin/, то скрипт service сможет найти initctl и попытается запустить ваше задание Upstart.


Интересно, в Ubuntu 12.04 скрипт service проверяет только, существует ли задание Upstart, опуская обе проверки initctl. Это означает, что если бы вы пытались сделать это на Ubuntu 12.04, он попытался бы использовать Upstart для запуска вашего сервиса. Однако, если /sbin/ не находится на пути, он потерпит неудачу с (немного) более понятным сообщением об ошибке:

/usr/bin/service: 123: exec: start: not found