O processo filho em segundo plano morre com o pai?

4

Eu tenho um script que chama vários outros sub-scripts. Mais tarde é morto e isso parece matar todos os sub-scripts.

Na maior parte, isso é o que eu quero. Mas há um caso ou dois em que não quero que uma criança morra.

Acho que lembro de impedir que isso aconteça baseando-se em & ao chamar um script.

Alguém pode confirmar isso?

    
por Philip Kirkbride 09.02.2018 / 01:21

1 resposta

4

Existem muitos fatores a serem considerados aqui. Por favor, tome esta resposta com um ligeiro ligeiro de sal, pois estou escrevendo todos esses detalhes da memória. (E, por favor, corrijam-me através de edições ou comentários, se você encontrar algum erro.)

Se você usar um comando em segundo plano com & e, em seguida, o shell pai sair normalmente, o comando background continuará sendo executado.

No entanto, se você estiver executando de forma interativa, o comando "backgrounded" será bloqueado quando tentar ler ou gravar no terminal. (Isso se aplica ou não o shell pai ainda está em execução.) Se stdout, stdin e stderr são redirecionados isso não importa.

Se você contextualizar um comando e, por exemplo, sua sessão SSH está desconectada, você pode esperar que o comando em segundo plano termine. Acredito que isso seja porque seu shell enviará SIGHUP para todos os processos filhos, mas não tenho 100% de certeza sobre os detalhes disso.

Se você renunciar a um trabalho (com o bash builtin disown ) depois do plano de fundo, ele não será finalizado apenas porque, por exemplo, sua sessão SSH é terminada. No entanto, o aspecto de ficar bloqueado ao tentar gravar no terminal ou ler do terminal ainda se aplica (para sessões interativas).

A maneira mais geral que eu conheço para iniciar um sub-script ou processo em segundo plano, de modo que ele não seja afetado, não importa o que aconteça ao shell que o gera (e independentemente de estar sendo iniciado interativamente ou de um script), é:

nohup somecommand >/dev/null 2>&1 </dev/null &

Isso pressupõe que você não se preocupa com QUALQUER saída do comando para o seu padrão ou erro padrão, e não precisa alimentar qualquer entrada padrão.

Se você está feliz com o sub-script para herdar os descritores de arquivo de seu pai (ou seja, o terminal não é um problema ou se você tem outra solução), então tudo que você precisa deve ser:

./some-sub-script &
exit

E apenas um comentário lateral, se você estiver escrevendo um daemon que deve ser deixado em execução, por favor (a) use logs e (b) cuide de rotacionar seus logs de maneira limpa. / p>     

por 09.02.2018 / 02:00