Quando você fecha uma janela de terminal, o emulador de terminal envia um SIGHUP para o processo que está executando, seu shell. Seu shell então encaminha esse SIGHUP para tudo que está sendo executado. No seu sistema local, este é o ssh. O ssh então encaminha o SIGHUP para o que ele está executando, o shell remoto. Então, seu shell remoto envia um SIGHUP para todos os seus processos, seu programa de segundo plano.
Existem 2 maneiras de contornar isso.
- Desassocie o programa em segundo plano do seu shell.
- Use o comando
disown
depois de aplicar o processo em segundo plano. Isso fará com que a concha se esqueça disso. - Prefixe seu comando com
nohup
(nohup $python program.py &
). Isso realiza a mesma coisa, mas usando um processo intermediário. Basicamente, ele ignora o sinal SIGHUP e, em seguida, bifurca-se & executa seu programa que herda a configuração e, em seguida, sai. Por causa do bifurcação, o programa que está sendo lançado não é filho do shell, e o shell não sabe disso. E a menos que ele instale um manipulador de sinal para SIGHUP, ele mantém a ação de ignorar de qualquer maneira.
- Use o comando
- Use
logout
em vez de fechar a janela do terminal. Quando você usalogout
, isso não é um SIGHUP e, portanto, o shell não envia um SIGHUP para nenhum de seus filhos.
Além disso, você deve certificar-se de que seu programa não grave no terminal através de STDOUT ou STDERR, já que ambos não existirão mais quando o terminal sair. Se você não os redirecionar para algo como /dev/null
, o programa ainda será executado, mas se tentar gravar neles, ele obterá um SIGPIPE, e a ação padrão do SIGPIPE é matar o processo). / p>