Eu tenho um script que chama vários outros subscripts. Mais tarde, é morto e isso parece matar todos os subscripts.
Na maioria das vezes é isso que eu quero. Mas há um ou dois casos em que não quero que uma criança morra.
Acho que me lembro de ser capaz de impedir que isso acontecesse colocando em segundo plano um &
ao chamar um script.
alguém pode confirmar isso?
Há muitos fatores a serem considerados aqui. Por favor, aceite esta resposta com um pouco de cautela, pois estou escrevendo todos esses detalhes de memória. (E, por favor, corrija-me por meio de edições ou comentários se encontrar algum erro.)
Se você executar um comando em segundo plano
&
e, em seguida, o shell pai sair normalmente, o comando em segundo plano continuará em execução.No entanto, se você estiver executando interativamente, o comando "em segundo plano" será bloqueado ao tentar ler ou gravar no terminal. (Isso se aplica independentemente de o shell pai ainda estar em execução.) Se stdout, stdin e stderr forem redirecionados, isso não importará.
Se você executar um comando em segundo plano e, por exemplo, sua sessão SSH for desconectada, você pode esperar que o comando em segundo plano seja encerrado. Acredito que seja porque seu shell enviará SIGHUP para todos os seus processos filhos, mas não tenho 100% de certeza sobre os detalhes disso.
Se você rejeitar um trabalho (com o bash embutido
disown
) depois de colocá-lo em segundo plano, ele não será encerrado apenas porque, por exemplo, sua sessão SSH foi encerrada. No entanto, o aspecto de ser bloqueado ao tentar gravar no terminal ou ler do terminal ainda se aplica (para sessões interativas).A maneira mais geral que conheço para iniciar um subscript ou processo em segundo plano, de modo que não seja afetado, não importa o que aconteça com o shell que o gera (e independentemente de estar sendo iniciado interativamente ou de um script), é:
Isso pressupõe que você não se importa com QUALQUER saída do comando para sua saída padrão ou erro padrão e não precisa alimentá-lo com nenhuma entrada padrão.
Se você está feliz que o subscript herde os descritores de arquivo de seu pai (ou seja, o terminal não é um problema ou você tem alguma outra solução), então tudo o que você precisa deve ser:
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 da rotação de seus logs de forma limpa.