Eu estava ajudando um colega que estava tendo problemas com um processo em segundo plano morrendo intermitentemente.
Descobri que eles estavam iniciando o processo em segundo plano efetuando login no servidor e executando:
su - <user> -c '<command>' &
"Aha", exclamei. "Se você iniciar um comando com" & ", ele será interrompido quando você sair do terminal de controle. Você precisa usar algo como nohup para conseguir isso. Realmente esse processo precisa suportar a execução como um daemon, tut tut."
Testamos o comando acima para demonstrar meu argumento e ... parecia funcionar: o processo iniciado pelo comando não saiu quando saímos do terminal que executava o comando acima.
O comando é um script Python personalizado cuja saída vai para um arquivo. Tanto quanto eu posso dizer, não existe um recurso "daemonize" inteligente no script. Ele não executa nenhuma das ações necessárias para executar como um daemon listado na página Wikipedia: Daemon (computação): Criação .
A execução do comando se comporta conforme o esperado:
<command> &
exit
No caso acima, o processo em segundo plano iniciado pelo comando sai quando saímos do terminal.
Minha pergunta é esta:
O que está acontecendo quando adicionamos "su - -c &" que impede que o processo saia quando nosso terminal sai. Eu gostaria de entender em detalhes com relação ao terminal de controle, entrada e saída padrão etc.
Essa é uma maneira razoável de atingir o objetivo de executar este comando como um processo em segundo plano. Se não, por que não?
Quero propagar as melhores práticas dentro da minha empresa, mas preciso demonstrar e fazer backup de todas as recomendações que faço.
Eu também quero entender exatamente o que está acontecendo.
fonte
chroot --userspec root:root / sh -c "exec some_forever_process" &
. O trabalho está sendo executado como o mesmo usuário, sem explícitonohup
antes oudisown
depois. Então, neste caso, como é que o sinal não pode ser entregue na saída a termo?some_forever_process
foi projetado para ser executado para sempre (um daemon) e, portanto, protege-se contra o recebimento de SIGHUP de uma saída do terminal (executando em seu próprio grupo de processos).