2015-06-30 24 views
6

TLDR; Ist es möglich, einen Cron-Job zu erstellen, der Dienst DienstnameStart läuft? Wie?Kann der "Service Start" von Upstart in einem Cron-Job verwendet werden?

Inhalt meiner

sudo crontab -e 

ist:

45 23 * * * service bormarise_celery_daemon start 

Dies läuft normalerweise auf dem Terminal als root oder Server:

service bormarise_celery_daemon start 
start: Job is already running: bormarise_celery_daemon 

Aber cron gab den folgenden Fehler statt:

bormarise_celery_daemon: unrecognized service 

Antwort

10

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:

  1. 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.
  2. Wenn dies der Fall ist, überprüft das Skript service, ob es initctl ausführen kann.
  3. 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 
+0

grep -q mit || ist sehr clever. TIL. Vielen Dank! – Irvan