
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 é encerrado com a mensagem:
Sinal capturado SIGHUP
SIGHUP capturado, mas não daemonizado. Saindo.
Eu não entendo; por que o processo está sendo encerrado quando foi iniciado em segundo plano usandonão, e?
Responder1
Seu programa Python desfaz nohup
.
nohup
ignora o sinal de desligamento SIG_IGN
e carrega seu programa em cadeia no mesmo processo.
Seu programa Pythonreinicia imediatamenteo tratamento do sinal de desligamento, instalando seu próprio manipulador de sinal. Esse manipulador verifica uma função interna (que não foi projetada muito bem, baseada em algumas suposições erradas, se for a que eu vi) e decide que o curso de ação apropriado ao receber um sinal de desligamento é imprimir essa mensagem e sair.
Seu programa Python por design não é nohup
capaz. Em um sistema com um shell de controle de trabalho e semântica de sessão/trabalho POSIX, você precisa estar disown
executando o trabalho para que o shell nunca saiba sobre ele para enviar um sinal de desligamento para ele em primeiro lugar.
(Mesmo isso não é suficiente nos sistemas operacionais systemd. Como o pessoal do systemd fez uma espécie de orelha de porco com seu mecanismo de sessão de login no espaço do usuário, você também precisa garantir que o mecanismo do systemd que sinaliza o desligamento do sistema, em vez de desligar, para sessões de login a cada logout também não estão sendo ativadas.)
Leitura adicional
- https://docs.cherrypy.org/en/latest/_modules/cherrypy/process/plugins.html
- O nohup tenta fazer com que o programa não tenha um terminal de controle?
- Diferença entre nohup, renegar e &
- Quando o tmux sai (fecha o pty master), os processos em segundo plano dos scripts de inicialização morrem - por quê?
- https://unix.stackexchange.com/a/310775/5132
- https://unix.stackexchange.com/a/379264/5132