nohup
rileva il segnale di riaggancio (vedi man 7 signal
) mentre la e commerciale no (eccetto che la shell è configurata in quel modo o non invia SIGHUP
affatto).
Normalmente, quando si esegue un comando usando &
e uscendo successivamente dalla shell, la shell terminerà il sottocomando con il segnale di riaggancio (kill -SIGHUP <pid>
). Questo può essere evitato usando nohup
, poiché rileva il segnale e lo ignora in modo che non raggiunga mai l'applicazione effettiva.
Nel caso tu stia usando bash, puoi usare il comando shopt | grep hupon
per scoprire se la tua shell invia o meno SIGHUP ai suoi processi figli. Se è disattivato, i processi non verranno terminati, come sembra essere il tuo caso. Ulteriori informazioni su come bash termina le applicazioni possono essere trovate qui.
Ci sono casi in cui nohup
non funziona, ad esempio quando il processo avviato riconnette il SIGHUP
segnale, come in questo caso.
myprocess.out &
eseguirà il processo in background utilizzando una subshell. Se la shell corrente viene terminata (diciamo tramite logout), anche tutte le subshell vengono terminate, quindi anche il processo in background verrebbe terminato. Il comando nohup ignora il HUP
signal e quindi anche se la shell corrente è terminata, la subshell e myprocess.out
continuerebbe a funzionare in background. Un'altra differenza è che &
alone non reindirizza lo stdout/stderr quindi se ci sono output o errori, questi vengono visualizzati sul terminale. nohup d'altra parte reindirizza lo stdout/stderr a nohup.out
o $HOME/nohup.out
.
La maggior parte delle volte accediamo al server remoto usando ssh. Se avvii uno script della shell e ti disconnetti, il processo viene interrotto. Nohup aiuta a continuare a eseguire lo script in background anche dopo che ti sei disconnesso dalla shell.
Nohup command name &
eg: nohup sh script.sh &
Nohup cattura i segnali HUP. Nohup non mette automaticamente il lavoro in background. Dobbiamo dirlo esplicitamente usando &