Por que o processo em segundo plano nohup está sendo morto?

10

Tentei iniciar um script de shell por meio de uma sessão remota, que inicia um processo em segundo plano usando o comando

nohup python3 run.py > nohup.out &

Quando a sessão remota é fechada, o processo está sendo interrompido com a mensagem:

Sinal capturado SIGHUP

SIGHUP capturado, mas não daemonizado. Sair.

Eu não entendo; por que o processo está sendo interrompido quando foi iniciado em segundo plano usando nohup & ?

Mani mais desejado
fonte
1
Eu costumava ficar confuso com todo o comportamento inesperado do controle de tarefas do shell. Agora, apenas uso tmuxe ignoro nohupou desonesto ou a tarefa em segundo plano completamente.
Siyuan Ren

Respostas:

10

Seu programa Python desfaz nohup.

nohupignora o sinal de desligamento SIG_IGNe carrega em cadeia seu programa no mesmo processo.

Seu programa Python redefine prontamente a manipulação do sinal para o sinal hangup, instalando seu próprio manipulador de sinais. Esse manipulador verifica uma função interna (que não foi projetada muito bem, baseando-se em algumas suposições falhas, se é a que eu já vi) e decide que o curso de ação apropriado ao receber um sinal de interrupção é imprimir essa mensagem e saia.

Seu programa Python por design não nohuppode ser ativado. Em um sistema com um shell de controle de trabalho e semântica de sessão / trabalho POSIX, você precisa estar disownexecutando o trabalho para que o shell nunca saiba sobre o envio de um sinal de interrupção em primeiro lugar.

(Mesmo que isso não seja suficiente nos sistemas operacionais systemd. Como as pessoas do systemd fizeram um pouco do ouvido de seu mecanismo de sessão de logon no espaço do usuário, também é necessário garantir que o mecanismo do systemd sinalize o desligamento do sistema, em vez de interromper, para as sessões de login em cada logout também não estão funcionando.)

Leitura adicional

JdeBP
fonte
3
É o programa Python que faz isso, ou é o intérprete Python (/ run-time environment) que o faz silenciosamente pelas costas?
Ilkkachu 29/05
Além disso, no Mac OS, o logout de uma sessão ssh mata os trabalhos de shell, mesmo quando você começou a usar nohup; não encontrei um remédio para isso
imhotap 29/05
Bem, se o problema for o manipulador de sinal, o OP poderá simplesmente mudar o manipulador de sinal para um manipulador que não interrompa o processo. Isso deve funcionar independentemente de quem instala esse manipulador de sinal. Eu gostaria de acrescentar sobre o ssh: às vezes, mesmo que o processo seja mantido vivo, ele pode ter problemas. Há alguns anos, perdi bastante tempo tentando entender alguns erros de permissão e, no final, o culpado era o Kerberos: quando a sessão ssh foi fechada, os tokens expiraram, então tive que criar novos tokens para serem usados ​​em vez daqueles da sessão ssh.
Bakuriu
@JdeBP Eu tentei setsid nohup python3 run.py > nohup.out &, o setsid resolveu esse problema. Essa é uma abordagem adequada?
MostWanted Mani