Tl; dr:
Why can the
sleepprocess survive when I log out and the terminal is closed? In my mind, everything except daemons andnohupprograms will be killed during logout. Ifsleepcan survive in this way, does it mean that I can use this method instead of thenohupcommand?
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.