Tl; dr:
Why can the
sleep
process survive when I log out and the terminal is closed? In my mind, everything except daemons andnohup
programs will be killed during logout. Ifsleep
can survive in this way, does it mean that I can use this method instead of thenohup
command?
A menos que a instância bash
gerada por ssh
tenha a opção huponexit
definida, nenhum processo será encerrado por qualquer média ao sair / sair e quando a opção huponexit
for definida, usando kill -9
no shell não é uma boa alternativa ao uso de nohup
nos processos filhos do shell; nohup
nos processos filhos do shell ainda os protegerá de SIGHUPs não provenientes do shell e, mesmo quando isso não for importante, nohup
ainda será o preferido, pois permite que o shell seja encerrado normalmente.
Em bash
, há uma opção chamada huponexit
, que, se definida, tornará bash
SIGHUP seus filhos na saída / logout;
Em instâncias não-login bash
interativas, como em bash
instance gerada por gnome-terminal
, essa opção é ignorada; se huponexit
estiver definido ou não definido, os filhos de bash
nunca serão SIGHUPped por bash
ao sair;
Em instâncias de login bash
interativas, como em uma instância de bash
gerada por ssh
, essa opção não é ignorada (no entanto, é desfeita por padrão); se huponexit
for definido, os filhos de bash
serão SIGHUPped por bash
na saída / logout; se huponexit
não estiver definido, os filhos de bash
não serão SIGHUPped por bash
na saída / logout;
Portanto, em geral, sair / sair de um login interativo bash
instance, a menos que a opção huponexit
esteja definida, não fará o shell SIGHUP ser seus filhos e sair / sair de um% de não-login interativobash
instance não tornará o shell SIGHUP seus filhos independentemente;
Isto é, no entanto, irrelevante neste caso: usar kill -9
sleep
sobreviverá independentemente, porque matar seu processo pai ( bash
) não deixará uma chance para o último fazer qualquer coisa para o primeiro (por exemplo, se a atual bash
instância foi um login bash
instance e a opção huponexit
foi definida, para SIGHUP it).
Somando-se a isso, diferente de outros sinais (como um sinal SIGHUP enviado para bash
), um sinal SIGKILL nunca é propagado para os processos filhos de um processo, portanto sleep
não é nem morto;
nohup
inicia um processo imune a sinais SIGHUP, o que é algo diferente; ele impedirá que o processo seja interrompido após a recepção de um sinal SIGHUP, que neste caso poderia ser recebido pelo login interativo bash
instance no caso de a opção huponexit
ter sido definida e o shell ter saído; então, tecnicamente, usar nohup
para iniciar um processo em um login interativo bash
instance com a opção huponexit
não configurada evitará que o processo seja interrompido após a recepção de um sinal SIGHUP, mas saindo / saindo do shell não será t SIGHUP independentemente,
Em geral, no entanto, quando nohup
é necessário para impedir que sinais SIGHUP sejam enviados do shell pai, não há motivo para preferir o kill -9
no método pai ao nohup
no método filho; em vez disso, deveria ser o oposto.
Matar o pai usando o método kill -9
não deixa uma chance para o pai sair normalmente, enquanto iniciar o filho usando o método nohup
permite que o pai seja terminado por outros sinais, como SIGHUP (para faça um exemplo que faça sentido no contexto de um filho que começou a usar nohup
), que permite que ele saia normalmente.