nohup
e disown -h
non sono esattamente la stessa cosa.
Con disown
, un processo viene rimosso dall'elenco dei lavori nella shell interattiva corrente. L'esecuzione jobs
dopo l'avvio di un processo in background e l'esecuzione disown
non mostreranno tale processo come processo nella shell. Un lavoro sconosciuto non riceverà un HUP
dalla shell quando esce (ma vedere la nota alla fine).
Con disown -h
, il lavoro non viene rimosso dall'elenco dei lavori, ma la shell non invierà un HUP
segnale se uscisse (ma vedere la nota alla fine).
L' nohup
utilità ignora il HUP
segnale e avvia l'utilità specificata. L'utilità eredita la maschera del segnale nohup
e pertanto ignora anche il HUP
segnale. Quando la shell termina, il processo rimane come processo figlio di nohup
(ed nohup
è ricomposto init
).
La differenza è che il processo iniziato con nohup
ignora HUP
indipendentemente da chi invia il segnale. I processi sconosciuti non vengono semplicemente inviati un HUP
segnale dalla shell , ma possono comunque essere inviati il segnale da ad esempio kill -s HUP <pid>
e non lo ignoreranno.
Si noti che HUP
viene inviato ai lavori di una shell solo se
- la shell è una shell di login e l'
huponexit
opzione shell è impostata, o
- lo stesso guscio riceve un
HUP
segnale.
Bit rilevanti dal bash
manuale (la mia enfasi):
SEGNALI
[...]
La shell esce di default alla ricezione di aSIGHUP
. Prima di uscire, una shell interattiva rinvia SIGHUP
a tutti i lavori, in esecuzione o arrestati. I lavori interrotti vengono inviati SIGCONT
per garantire che ricevano il
SIGHUP
. Per impedire alla shell di inviare il segnale a un particolare lavoro, è necessario rimuoverlo dalla tabella dei lavori con disown
incorporato (vedere di SHELL BUILTIN COMMANDS
seguito) o contrassegnare per non ricevere SIGHUP
utilizzando disown -h
.
Se l' huponexit
opzione shell è stata impostata con shopt
, bash
invia un
SIGHUP
a tutti i lavori quando esce una shell di login interattiva.
disown [-ar] [-h] [jobspec ... | pid ... ]
Senza opzioni, rimuoverli tutti jobspec
dalla tabella dei lavori attivi. [...] Se -h
viene fornita l' opzione, ognuna nonjobspec
viene rimossa dalla tabella, ma è contrassegnata in modo tale da SIGHUP
non essere inviata al lavoro se la shell riceve unSIGHUP
. [...]
Relazionato:
nohup
, è necessario reindirizzare stdin / stdout / stderr lontano dal TTY (se la shell originale deve essere connessa a te). (OTOH, in realtà considero quella pratica migliore che fare affidamento su un default egocentrico hardcoded come./nohup.out
).