2015-06-30 5 views
6

TLDR; È possibile creare un cron job che esegue il servizio nome_serviziostart? Come?L'avvio del servizio di upstart può essere utilizzato all'interno di un cron job?

contenuto del mio

sudo crontab -e 

è:

45 23 * * * service bormarise_celery_daemon start 

Questo viene eseguito normalmente terminale come root o server:

service bormarise_celery_daemon start 
start: Job is already running: bormarise_celery_daemon 

Ma cron ha dato il seguente errore invece:

bormarise_celery_daemon: unrecognized service 

risposta

10

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:

  1. 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.
  2. In tal caso, lo script service verificherà se è possibile eseguire initctl.
  3. 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 
+0

grep -q con || è molto intelligente TIL. Grazie! – Irvan