Можно ли использовать "служебный старт" выскочки внутри задания 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