2015-04-22 10 views
18

Sto provando a creare un'attività in ansible che esegue un comando shell per eseguire un eseguibile in modalità demone utilizzando &. Qualcosa di simile a seguitoDemonizzare un eseguibile in ansibile

-name: Start daemon 
    shell: myexeprogram arg1 arg2 & 

Cosa sto vedendo è che se io continuo & il compito restituisce immediatamente e il processo non è stato avviato. Se rimuovo & attività ansible attende per un bel po 'di tempo senza ritorno.

Apprezzare il suggerimento sul modo corretto di avviare il programma in modalità daemon tramite ansible. Si noti che non desidero eseguire questo come servizio ma un processo in background ad hoc basato su determinate condizioni.

risposta

15

programma in esecuzione con '&' non rende il programma un demone, è appena viene eseguito in background. Per creare un "demone vero" il tuo programma dovrebbe fare i passi descritti here.

Se il programma è scritto in C, è possibile chiamare la funzione daemon(), che lo farà per voi. Quindi puoi avviare il tuo programma anche senza '&' alla fine e verrà eseguito come un demone.

L'altra opzione è chiamare il programma utilizzando daemon, che dovrebbe svolgere anche il lavoro.

- name: Start daemon 
    shell: daemon -- myexeprogram arg1 arg2 
+0

Grazie! Questo mi ha aiutato! – user3364247

+0

Si noti che i passaggi collegati [sono considerati un anti-pattern al giorno d'oggi] (https://www.freedesktop.org/software/systemd/man/daemon.html): 'Per lo sviluppo di un demone di nuovo stile, nessuno dei le fasi di inizializzazione raccomandate per i daemon SysV devono essere implementate. I sistemi di init di nuovo stile come systemd rendono tutti ridondanti. Inoltre, poiché alcuni di questi passaggi interferiscono con il monitoraggio dei processi, il passaggio dei descrittori dei file e altre funzionalità del sistema init, si consiglia di non eseguirli quando vengono eseguiti come nuovo stile di servizio. – GnP

10

Quando si (o Ansible) si disconnette, il segnale di uscita verrà comunque inviato al processo in esecuzione, anche se è in esecuzione in background.

È possibile utilizzare nohup per eludere quello.

- name: Start daemon 
    shell: nohup myexeprogram arg1 arg2 & 

http://en.wikipedia.org/wiki/Nohup

+5

nohup non funziona su Ansible. Prova per te. – Boyang

+3

Questo viene eseguito all'interno di una sessione SSH non interattiva, quindi questo processo morirà non appena la sessione sarà. – mschuett

+0

Questa è una grande idea se ha funzionato! –

5

Dalla breve descrizione su ciò che si vuole raggiungere, suona come sarebbe meglio per voi di impostare il file eseguibile come un servizio (utilizzando Upstart o simili) e quindi avviare/fermare in base alle esigenze base sulle altre condizioni che richiedono che sia in esecuzione (o non in esecuzione).

Provare a eseguire questo come un processo altrimenti comporterà dover catturare il PID o simile in modo da poter provare e spegnere il demone che si è avviato quando è necessario, con praticamente la stessa quantità di complessità dell'installazione di un init il file di configurazione prenderebbe e senza le sottigliezze che sistemi come Upstart ti danno i controlli come start/stop.

1

Ho trovato il modo migliore, in particolare perché volevo che l'output fosse registrato, doveva utilizzare il pacchetto "daemonize". Se sei su CentOS/Redhat, come sotto. Probabilmente c'è anche un pacchetto apt per questo.

- name: yum install daemonize 
    yum: 
    name: daemonize 
    state: latest 

- name: run in background, log errors and standout to file 
    shell: daemonize -e /var/log/myprocess.log -o /var/log/myprocess.log /opt/myscripts/myprocess.sh 
Problemi correlati