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 & ?
background-process
nohup
Mani mais desejado
fonte
fonte
tmux
e ignoronohup
ou desonesto ou a tarefa em segundo plano completamente.Respostas:
Seu programa Python desfaz
nohup
.nohup
ignora o sinal de desligamentoSIG_IGN
e 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
nohup
pode ser ativado. Em um sistema com um shell de controle de trabalho e semântica de sessão / trabalho POSIX, você precisa estardisown
executando 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
fonte
nohup
; não encontrei um remédio para issosetsid nohup python3 run.py > nohup.out &
, o setsid resolveu esse problema. Essa é uma abordagem adequada?