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 captado SIGHUP
SIGHUP capturado, mas não daemonizado. Saindo.
Não entendo; por que o processo está sendo morto quando foi iniciado em segundo plano usando nohup & ?
Seu programa Python desfaz
nohup
.nohup
ignora o sinal de desligamentoSIG_IGN
e, em seguida, carrega em cadeia o seu programa no mesmo processo.Seu programa Python redefine prontamente o tratamento de sinal para o sinal de desligamento, instalando seu próprio manipulador de sinal. Esse manipulador verifica uma função interna (que não é muito bem projetada, sendo baseada em algumas suposições falhas, se é que eu vi) e decide que o curso de ação apropriado ao receber um sinal de desligamento é imprimir essa mensagem e saia.
Seu programa Python por design não é
nohup
capaz. Em um sistema com um shell de controle de tarefa e sessão POSIX/semântica de tarefa, você precisadisown
executar a tarefa para que o shell nunca saiba sobre ela para enviar um sinal de desligamento a ela em primeiro lugar.(Mesmo isso não é suficiente em sistemas operacionais systemd. Como o pessoal do systemd fez um pouco de orelha de porco com o mecanismo de sessão de login do 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 em cada logout também não estão funcionando.)
Leitura adicional