nohup
e disown -h
não são exatamente a mesma coisa.
Com disown
, um processo é removido da lista de trabalhos no shell interativo atual. A execução jobs
após o início de um processo em segundo plano e a execução disown
não mostrará esse processo como um trabalho no shell. Um trabalho renegado não receberá um HUP
do shell quando sair (mas consulte a observação no final).
Com disown -h
, o trabalho não é removido da lista de trabalhos, mas o shell não enviaria um HUP
sinal se saísse (mas veja a observação no final).
O nohup
utilitário ignora o HUP
sinal e inicia o utilitário especificado. O utilitário herda a máscara de sinal nohup
e, portanto, também ignorará o HUP
sinal. Quando o shell termina, o processo permanece como um processo filho de nohup
(e nohup
é reinserido como pai init
).
A diferença é que o processo iniciado com nohup
ignora, HUP
independentemente de quem envia o sinal. Os processos deserdado não são apenas enviou um HUP
sinal pelo shell , mas ainda pode ser enviado o sinal a partir por exemplo kill -s HUP <pid>
e não irá ignorar isso.
Observe que HUP
somente é enviado para os trabalhos de um shell se
- o shell é um shell de logon e a
huponexit
opção shell está definida ou
- a própria concha recebe um
HUP
sinal.
Bits relevantes do bash
manual (minha ênfase):
SINAIS
[...]
O shell sai por padrão após o recebimento de aSIGHUP
. Antes de sair, um shell interativo reenvia SIGHUP
todos os trabalhos, em execução ou interrompidos. Os trabalhos interrompidos são enviados SIGCONT
para garantir que eles recebam o
SIGHUP
. Para impedir que o shell envie o sinal para um trabalho específico, ele deve ser removido da tabela de trabalhos com o disown
built-in (veja SHELL BUILTIN COMMANDS
abaixo) ou marcado para não receber o SIGHUP
uso disown -h
.
Se a huponexit
opção shell tiver sido definida com shopt
, bash
envia um
SIGHUP
para todos os trabalhos quando um shell de logon interativo sai.
disown [-ar] [-h] [jobspec ... | pid ... ]
Sem opções, remova cada uma jobspec
da tabela de trabalhos ativos. [...] Se a -h
opção for dada, cada jobspec
um não será removido da tabela, mas será marcado para que SIGHUP
não seja enviado ao trabalho se o shell receber aSIGHUP
. [...]
Relacionado:
nohup
, precisará redirecionar stdin / stdout / stderr para longe do TTY (caso seu shell original esteja conectado a um). (OTOH, na verdade, considero essa prática melhor do que confiar em um padrão codificado egregado como./nohup.out
).