Em quais casos o SIGHUP não é enviado para um trabalho quando você efetua logout?

10

Eu li uma resposta de um usuário que afirmou que a execução

foo 2>&1 >& output.log &

resultaria em foo continuando a ser executado mesmo quando eles saíssem. De acordo com esse usuário, isso funcionou até mesmo em conexões SSH.

Eu realmente não acreditei nisso, pois fiquei com a impressão de que, no caso de desconectar do SSH, ou terminar o TTY, o shell e, portanto, seus processos receberiam um SIGHUP, fazendo com que eles terminassem. Isso, sob minha suposição, foi a única razão para usar nohup nesses casos, ou tmux , screen et al.

Depois, consultei o manual da glibc :

This signal is also used to report the termination of the controlling process on a terminal to jobs associated with that session; this termination effectively disconnects all processes in the session from the controlling terminal.

Isso parece confirmar meus pensamentos. Mas, olhando mais adiante, diz :

If the process is a session leader that has a controlling terminal, then a SIGHUP signal is sent to each process in the foreground job, and the controlling terminal is disassociated from that session.

Então, isso significa que postos de trabalho colocados em segundo plano não receberão SIGHUP?

Para minha maior confusão, executei uma sessão Zsh interativa, executei yes >& /dev/null & e digitei exit , quando Zsh me avisou que eu estava executando trabalhos e depois de digitar exit pela segunda vez, me disse que tinha SIGHUPed um trabalho. Fazer exatamente o mesmo no Bash deixa o trabalho em execução…

    
por slhck 28.07.2013 / 22:16

1 resposta

16

O Bash parece enviar o SIGHUP somente se ele mesmo recebeu um SIGHUP , que por exemplo ocorre quando um terminal virtual é fechado ou quando a conexão SSH é interrompida. Na documentação :

The shell exits by default upon receipt of a SIGHUP. Before exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP. To prevent the shell from sending the SIGHUP signal to a particular job, it should be removed from the jobs table with the disown builtin (see Job Control Builtins) or marked to not receive SIGHUP using disown -h.

Portanto, se você digitar exit ou pressionar Ctrl + D , todo o processo em segundo plano permanecerá, pois isso não envia um sinal de interrupção para o Bash.

Você pode forçar o Bash a avisá-lo sobre o fato de que ainda há processos em segundo plano com

shopt -s checkjobs

Existe uma opção para enviar o SIGHUP ao sair se você estiver em um shell interativo ( veja aqui ). Mas isso não funciona na minha máquina com o Bash 4.2.25. Talvez isso funcione para você

shopt -s huponexit
    
por 02.08.2013 / 12:53

Tags