Tl; dr:
Perché il sleep
processo può sopravvivere quando esco e il terminale è chiuso? Nella mia mente, tutto tranne i demoni e i nohup
programmi verranno uccisi durante il logout. Se sleep
riesco a sopravvivere in questo modo, significa che posso usare questo metodo invece del nohup
comando?
A meno che l' bash
istanza generata da non ssh
abbia l' huponexit
opzione impostata, nessun processo verrà terminato in alcun modo all'uscita / disconnessione e quando l' huponexit
opzione è impostata, l'uso kill -9
sulla shell non è una buona alternativa all'utilizzo nohup
sui processi figlio della shell; nohup
sui processi figlio della shell li proteggerà comunque dai SIGHUP che non provengono dalla shell e anche quando ciò non nohup
è importante è ancora preferibile perché consente alla shell di essere terminata con grazia.
In bash
c'è un'opzione chiamata huponexit
, che se impostata renderà bash
SIGHUP i suoi figli all'uscita / logout;
Nelle istanze interattive senza accesso bash
, come in bash
un'istanza generata da gnome-terminal
, questa opzione viene ignorata; se huponexit
impostato o non impostato, bash
i bambini non saranno mai SIGHUPPassati bash
all'uscita;
Nelle istanze di login interattive bash
, come in bash
un'istanza generata da ssh
, questa opzione non viene ignorata (tuttavia non è impostata per impostazione predefinita); se huponexit
impostato, bash
i bambini verranno SIGHUPpuliti bash
all'uscita / logout; se huponexit
non è impostato, bash
i bambini non verranno SIGHUPpuliti bash
all'uscita / logout;
Quindi, in generale, uscire / disconnettersi da bash
un'istanza di login interattiva , a meno che non huponexit
sia impostata l' opzione, non farà della shell SIGHUP i suoi figli, e uscire / disconnettersi da bash
un'istanza non di login interattiva non farà della shell SIGHUP i suoi figli indipendentemente;
Questo, tuttavia, è irrilevante in questo caso: l'utilizzo kill -9
sleep
sopravviverà a prescindere, perché uccidere il suo processo genitore ( bash
) non lascerà la possibilità a quest'ultimo di fare qualcosa al primo (cioè, ad esempio, se l' bash
istanza corrente fosse bash
un'istanza di accesso e l' huponexit
opzione è stata impostata su SIGHUP it).
In aggiunta a questo, a differenza di altri segnali (come un segnale SIGHUP inviato a bash
), un segnale SIGKILL non viene mai propagato ai processi figlio di un processo, quindi sleep
non viene nemmeno ucciso;
nohup
avvia un processo immune ai segnali SIGHUP, che è qualcosa di diverso; eviterà che il processo si interrompa alla ricezione di un segnale SIGHUP, che in questo caso potrebbe essere ricevuto dall'istanza di accesso interattivo bash
nel caso in cui l' huponexit
opzione fosse impostata e la shell uscisse; quindi tecnicamente l'utilizzo nohup
per avviare un processo in bash
un'istanza di login interattiva con l' huponexit
opzione unset impedirà al processo di riagganciare alla ricezione di un segnale SIGHUP, ma uscire / disconnettersi dalla shell non lo SIGHUP indipendentemente;
In generale, tuttavia, quando nohup
è necessario per impedire che i segnali SIGHUP provengano dalla shell genitore, non c'è motivo di preferire il kill -9
metodo on sul genitore al metodo nohup
on sul figlio; invece, dovrebbe essere il contrario.
Uccidere il genitore usando il kill -9
metodo non lascia al genitore la possibilità di uscire con garbo, mentre l'avvio del figlio usando il nohup
metodo consente al genitore di essere chiuso da altri segnali, come SIGHUP (per fare un esempio che ha senso nel contesto di un bambino ha iniziato a utilizzare nohup
), che gli consente di uscire con grazia.
&
eseguirà il fork del processo in background (come daemon) e continuerà a funzionare anche se si è disconnessi.