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

9

Eu 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 é eliminado com a mensagem:

Caught signal SIGHUP

SIGHUP caught but not daemonized. Exiting.

Eu não entendo; Por que o processo foi morto quando foi iniciado em segundo plano usando nohup & ?

    
por Mostwanted Mani 29.05.2018 / 09:25

1 resposta

10

Seu programa Python desfaz nohup .

nohup ignora o sinal de desconexão com SIG_IGN e, em seguida, a cadeia carrega seu programa no mesmo processo.

Seu programa em Python reinicia imediatamente o tratamento de sinal para o sinal de desconexão, 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 incorretas, se é a que eu vi) e decide que o curso apropriado de ação ao receber um sinal de desligamento é imprimir essa mensagem. e sair.

Seu programa em Python por design não é nohup -able. Em um sistema com uma shell de controle de job e semântica de sessão / job POSIX, você precisa estar disown ing da tarefa para que a shell nunca saiba sobre ela para enviar um sinal de desligamento a ela em primeiro lugar.

(Mesmo que isso não seja suficiente nos sistemas operacionais systemd. Como as pessoas do sistema fizeram um pouco de orelha de porco em seu mecanismo de sessão de login do espaço do usuário, você também precisa garantir que o mecanismo do systemd sinalize o desligamento do sistema desligar, para sessões de login em cada logout também não está chutando.)

Leitura adicional

por 29.05.2018 / 10:21