tl; dr
È necessario aggiungere /sbin
a cron di PATH
modo lo script service
riesce a trovare initctl
. Per fare questo, aggiungere una definizione come questo per la parte superiore del vostro crontab:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Si può ancora incorrere in problemi con cron
emailing dal initctl
uscite con lo stato 1 (non riuscito) se il lavoro si tenta di avviare è già correndo. Si potrebbe ottenere in giro che con qualcosa di simile:
45 23 * * * service bormarise_celery_daemon status | grep -q running || service bormarise_celery_daemon start
Nonostante sia un po 'lungo, si deve solo cercare di eseguire il comando di avvio se il servizio bormarise_celery_daemon
non è in esecuzione.
servizio vs initctl
Mentre il comando service
fa un tentativo di gestire i lavori Upstart, non è la funzione di controllo Upstart attuale - che sarebbe initctl
e la relativa suite di comandi a breve mano (cioè , start
, stop
, ecc.). Tutti gli script Upstart risiedono in /sbin/
.
Il comando service
tenta di facilitare la diffusione di servizi tra Upstart e gli script classici in stile SysV. In questo modo è possibile utilizzare un'unica interfaccia (lo script service
) per gestire i servizi da entrambi i sistemi.
Addentrarsi nel servizio Script
Se si sfoglia la vera fonte dello script service
(è solo uno script Bash) su Ubuntu 14.04, vedrete:
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
condizionale L'apertura:
- Controlla se il servizio specificato (nel tuo caso:
bormarise_celery_daemon
) è un lavoro di Upstart.I lavori Upstart vanno su /etc/init/
con l'estensione .conf
.
- In tal caso, lo script
service
verificherà se è possibile eseguire initctl
.
- Se possibile, lo script
service
verificherà quindi che initctl
sia una versione abbastanza nuova.
Se tutto questo è vero, allora lo script service
tenterà di utilizzare il comando appropriato initctl
per eseguire il processo Upstart. Ad esempio:
service bormarise_celery_daemon start
traduce in:
start bormarise_celery_daemon
che è (praticamente) equivalente a:
initctl start bormarise_celery_daemon
Tuttavia, se uno qualsiasi di queste condizioni non è vero, il service
lo script presuppone che tu stia cercando di eseguire uno script in stile SysV. Questi sono solo script Bash che si trovano in /etc/init.d/
. Tuttavia, se non esiste uno script di questo tipo, uscirà con il messaggio di errore unrecognized service
.
Mettere insieme i pezzi
L'impostazione predefinita PATH
per cron contiene solo /bin/
e /usr/bin/
. Ciò significa che non include /sbin/
, dove si trova l'eseguibile initctl
. Ciò significa che cron
non sarà in grado di eseguire initctl
.
Quando cron
esegue il crontab, il service
sceneggiatura è in grado di trovare il tuo lavoro Upstart, ma è non in grado di eseguire il comando initctl
, quindi salta il tentativo di eseguire il servizio tramite Upstart (cioè, initctl
). Invece, cerca quindi di cercare uno script in stile SysV in /etc/init.d/
. Poiché tale script non esiste, lo script service
si arrende e stampa il messaggio di errore.
In caso di superamento di default cron
s' PATH
con uno compreso /sbin/
, lo script service
sarà in grado di trovare initctl
e tenterà di lanciare il vostro lavoro Upstart.
È interessante notare che, su Ubuntu 12.04 lo script service
controlla solo per vedere se esiste un lavoro Upstart, omettendo entrambi initctl
controlli. Ciò significa che se stavi provando questo su Ubuntu 12.04, tenterebbe di utilizzare Upstart per avviare il tuo servizio. Tuttavia, se /sbin/
non è sulla strada, sarebbe riuscire con un messaggio di errore (leggermente) più comprensibile:
/usr/bin/service: 123: exec: start: not found
grep -q con || è molto intelligente TIL. Grazie! – Irvan