Ci sono molti casi in cui piccole differenze tra gli ambienti possono morderti. Questo è quello in cui mi sono imbattuto di recente. Qual è la differenza tra questi due comandi?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
La risposta è la stessa del solito - dipende.
nohup cattura il segnale di hangup mentre la e commerciale no.
Qual è il segnale di riaggancio?
SIGHUP - Hangup rilevato sul terminale di controllo o morte del processo di controllo (valore: 1).
Normalmente, quando si esegue un comando utilizzando & e successivamente si esce dalla shell, la shell termina il comando secondario con il segnale di blocco (come kill -SIGHUP $ PID). Questo può essere evitato usando nohup, in quanto cattura il segnale e lo ignora in modo che non raggiunga mai l'applicazione effettiva.
Bene, ma come in questo caso ci sono sempre dei "ma". Non vi è alcuna differenza tra questi metodi di avvio quando la shell è configurata in un modo in cui non invia affatto SIGHUP.
Nel caso in cui si usi bash, è possibile utilizzare il comando specificato di seguito per scoprire se la shell invia SIGHUP ai suoi processi figlio o meno:
~ $ shopt | grep hupon
E inoltre - ci sono casi in cui nohup non funziona. Ad esempio, quando il processo avviato riconnette il segnale NOHUP (viene eseguito all'interno, a livello di codice dell'applicazione).
Nel caso descritto, la mancanza di differenze mi ha colpito quando all'interno di uno script di avvio del servizio personalizzato è stata effettuata una chiamata a un secondo script che imposta e avvia l'applicazione corretta senza un comando nohup.
In un ambiente Linux tutto ha funzionato senza problemi, in un secondo l'applicazione si è chiusa non appena è uscito il secondo script (rilevando quel caso, ovviamente mi ci è voluto molto più tempo di quello che potresti pensare: stuck_out_tongue :).
Dopo aver aggiunto nohup come metodo di avvio al secondo script, l'applicazione continua a funzionare anche se gli script usciranno e questo comportamento diventerà coerente in entrambi gli ambienti.