Можно ли использовать "служебный старт" выскочки внутри задания 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 ответ:
Tl; dr
Вам нужно добавить
/sbin
в cron'SPATH
, чтобы скрипт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
Условие открытия:
- проверяет, является ли указанная вами служба (в вашем случае:
bormarise_celery_daemon
) работой выскочки. Задания выскочек входят в/etc/init/
с расширением.conf
.- если это так, то скрипт
service
проверит, может ли он работать.initctl
.- если это возможно, то скрипт
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 defaultPATH
с одним включением/sbin/
, то скриптservice
сможет найтиinitctl
и попытается запустить ваше задание Upstart.
Интересно, в Ubuntu 12.04 скрипт
service
проверяет только, существует ли задание Upstart, опуская обе проверкиinitctl
. Это означает, что если бы вы пытались сделать это на Ubuntu 12.04, он попытался бы использовать Upstart для запуска вашего сервиса. Однако, если/sbin/
не находится на пути, он потерпит неудачу с (немного) более понятным сообщением об ошибке:/usr/bin/service: 123: exec: start: not found