tl; dr
Sie müssen /sbin
zu cron ist hinzuzufügen PATH
so das service
Skript initctl
finden. Um dies zu tun, fügen Sie eine Definition wie folgt auf die Spitze Ihres crontab:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Sie noch in Probleme mit cron
laufen können Sie seit initctl
Ausfahrten mit dem Status 1 (gescheitert) E-Mail, wenn der Auftrag, den Sie versuchen, zu starten ist läuft bereits. Sie könnten wie mit etwas um, dass zu bekommen:
45 23 * * * service bormarise_celery_daemon status | grep -q running || service bormarise_celery_daemon start
Trotz etwas lang ist, sollte es nur versuchen, den Startbefehl ausgeführt werden, wenn der bormarise_celery_daemon
Dienst wird nicht ausgeführt.
Service vs initctl
Während der service
Befehl einen Versuch macht Upstart Aufträge zu verwalten, ist es nicht die tatsächliche Upstart Steuerungsfunktion ist - das initctl
und die damit verbundene Reihe von Kurz Hand Befehle wäre (dh , start
, stop
, usw.). Alle Upstart-Skripts befinden sich in /sbin/
.
Der Befehl service
versucht, Benutzern die Verbreitung von Diensten zwischen Upstart- und klassischen SysV-Skripts zu erleichtern. Auf diese Weise können Sie eine Schnittstelle (das Skript service
) verwenden, um Dienste von beiden Systemen zu verwalten.
in den Dienst Delving Script
Wenn Sie die tatsächliche Quelle des service
Skript zu sehen (es ist nur ein Bash-Skript) auf Ubuntu 14.04, werden Sie sehen:
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
Die Öffnung bedingt:
- Prüft, ob der angegebene Dienst (in Ihrem Fall:
bormarise_celery_daemon
) ein Upstart-Job ist.Upstart-Jobs gehen in /etc/init/
mit einer .conf
Erweiterung.
- Wenn dies der Fall ist, überprüft das Skript
service
, ob es initctl
ausführen kann.
- Wenn es kann, wird das
service
Skript dann sicherstellen, dass initctl
eine neue genug Version ist.
Wenn all das wahr ist, dann ist das service
Skript wird versuchen passenden initctl
Befehl verwenden, um den Upstart Job ausgeführt werden soll. Zum Beispiel:
service bormarise_celery_daemon start
übersetzt in:
start bormarise_celery_daemon
die (im wesentlichen) entspricht:
initctl start bormarise_celery_daemon
jedoch, wenn eine dieser Bedingungen nicht wahr ist, die service
Das Skript geht davon aus, dass Sie versuchen, ein Skript im Stil von SysV auszuführen. Dies sind nur Bash-Skripte in /etc/init.d/
. Wenn jedoch kein solches Skript existiert, wird es mit der Fehlermeldung unrecognized service
beendet.
die Stücke zusammen
Der Standard PATH
für cron Putting enthält nur /bin/
und /usr/bin/
. Dies bedeutet, dass es /sbin/
nicht enthält, wo die initctl
ausführbare Datei ist. Dies bedeutet cron
kann initctl
nicht ausgeführt werden.
Wenn cron
crontab läuft, das service
Skript ist der Lage, Ihre Upstart Job zu finden, aber es ist nicht der Lage, den initctl
Befehl ausgeführt werden soll, so dass es über Upstart Ihren Dienst zu laufen versuchen, überspringt (dh, initctl
). Stattdessen wird versucht, in /etc/init.d/
nach einem SysV-style-Skript zu suchen. Da dieses Skript nicht existiert, gibt das Skript service
auf und druckt Ihre Fehlermeldung.
Wenn Sie außer Kraft setzen cron
‚s Standard PATH
mit einem /sbin/
einschließlich, dann ist das service
Skript wird in der Lage sein initctl
zu finden und versuchen, Ihre Upstart Job zu starten.
Interessanterweise auf Ubuntu 12.04 das service
Skript prüft nur, ob ein Upstart Job existiert, Weglassen beiden initctl
Kontrollen. Das heißt, wenn Sie dies auf Ubuntu 12.04 versuchen würden, würde es versuchen, Upstart zu verwenden, um Ihren Dienst zu starten. Wenn jedoch /sbin/
nicht auf dem Weg ist, wäre es mit einer (leicht) verständlichere Fehlermeldung fehlschlagen:
/usr/bin/service: 123: exec: start: not found
grep -q mit || ist sehr clever. TIL. Vielen Dank! – Irvan