Este é um acompanhamento para esta pergunta .
Eu fiz mais alguns testes; parece que realmente não importa se isso é feito no console físico ou via SSH, nem acontece apenas com o SCP; Eu também testei com cat /dev/zero > /dev/null
. O comportamento é exatamente o mesmo:
- Inicie um processo em segundo plano usando
&
(ou coloque-o em segundo plano depois de começar a usarCTRL-Z
ebg
); isso é feito sem usarnohup
. - Sair.
- Faça logon novamente.
- O processo ainda está lá, rodando feliz, e agora é filho direto de
init
.
Posso confirmar que o SCP e o CAT são encerrados imediatamente se for enviado um SIGHUP
; Eu testei isso usando kill -HUP
.
Portanto, realmente parece que o SIGHUP não foi enviado no logoff, pelo menos para processos em segundo plano (não é possível testar com um primeiro plano por razões óbvias).
Isso aconteceu comigo inicialmente com o console de serviço do VMware ESX 3.5 (baseado no RedHat), mas consegui replicá-lo exatamente no CentOS 5.4.
A questão é: novamente, um SIGHUP não deve ser enviado aos processos, mesmo que estejam em execução em segundo plano, após o logoff? Por que isso não está acontecendo?
Editar
Eu verifiquei com strace
, de acordo com a resposta de Kyle.
Como eu esperava, o processo não recebe nenhum sinal ao sair do shell onde foi iniciado. Isso acontece ao usar o console do servidor e via SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Respostas:
Resposta encontrada.
Para o BASH, isso depende da
huponexit
opção do shell, que pode ser visualizada e / ou definida usando oshopt
comando interno.Parece que essas opções estão desativadas por padrão, pelo menos nos sistemas baseados em RedHat.
Mais informações na página do manual BASH :
fonte
Será enviado SIGHUP nos meus testes:
Shell1:
Shell2:
Shell1 Novamente:
Shell2 Novamente :
Por que ele ainda roda ?:
A programação avançada no ambiente Unix de Stevens aborda isso na seção 9.10: Grupos de processos órfãos. A seção mais relevante é:
fonte
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Estranho, definitivamente não de acordo com a seção citada por Stevens.Fiz alguns testes usando o CentOS 7.1 e o bash. Observe que isso significa que
huponexit
estáoff
por padrão e foi desativado na maioria dos meus testes.Você precisa
nohup
quando inicia um trabalho em um terminal, porque se você fechar esse terminal sem sair do shell de forma limpa , o terminal envia o sinal SIGHUP ao shell, que então o envia a todas as crianças. Se você sair do shell de forma limpa, o que significa que o trabalho já deve estar em segundo plano, para que você possa digitarexit
ou pressionar Control-D no prompt de comando, nenhum sinal de qualquer tipo será enviado para o trabalho em segundo plano a partir do bash.Teste:
Terminal 1
Terminal 2
(feche o terminal 1, visto no terminal 2):
Trabalho
doit.sh
:Inicie em segundo plano no Terminal 1:
Terminal 1
Strace no Terminal 2; feche o Terminal 1 após alguns loops:
Terminal 2
Saída no terminal 3:
Terminal 3
No entanto, se você sair
bash
, simplesmente sai sem enviar nenhum sinal para a criança. O terminal sairá porque não tem mais um filho, mas é claro que não há ninguém no HUP porque o shell filho já se foi. OSIGINT
,SIG_BLOCK
eSIG_SETMASK
você vê abaixo são devido aosleep
no shell.Terminal 1
Terminal 2
Terminal 3, saída
Curiosamente, eu comecei
huponexit
a trabalharshopt -s huponexit; shopt
(o último para revisar), depois realizei o último teste e, novamente, o bash não enviou nenhum sinal para o processo em segundo plano . Ainda mais interstingly, como vimos o bash fez enviar o sinal para o processo em segundo plano depois que ele recebeu de um terminal que fechou em seu rosto. Parece quehuponexit
não tinha um rumo de um jeito ou de outro.Espero que isso remova qualquer mistério ou confusão sobre pelo menos a felicidade do bash, sobre quando e como o sinal HUP é enviado. Pelo menos meus testes eram completamente reproduzíveis para mim. Gostaria de saber se existem outras configurações que possam estar afetando o comportamento do bash.
E, como sempre, YSMV (seu shell pode variar).
Adenda 1
Quando executo um shell como
exec /bin/sh
, em seguida, executo o script como/bin/sh ./doit.sh &
e saio do shell corretamente, nenhum sinal é enviado para o trabalho em segundo plano e ele continua sendo executado até a conclusão.Adenda 2
Quando executo um shell como
exec /bin/csh
, em seguida, executo o script como/bin/sh ./doit.sh &
e saio do shell corretamente, nenhum sinal é enviado para o trabalho em segundo plano e ele continua sendo executado até a conclusão.fonte
Eu uso o csh e os processos em segundo plano continuam sendo executados quando eu faço o logoff.
fonte