Esta é mais uma questão de gerenciamento de processos / manipulação de sinais do que uma questão de Bash. Apenas usa o Bash para explicar o problema.
Estou executando um script Bash no qual executo um processo em segundo plano.
Este é o script:
#!/bin/bash
# ...
# The background process
{
while :; do
sleep 1 && echo foo >> /path/to/some/file.txt
done
} &
# ...
exit 0
NÃO executo o script em segundo plano. Simplesmente ./script
.
A opção shell "huponexit" é ativada usando shopt -s huponexit
, portanto, quando o terminal está sendo fechado, espero que ele envie um sinal HUP para Bash, que irá propagá-lo até atingir o processo em segundo plano. Se o processo em segundo plano não for trap
e ignorar o sinal, ele também será eliminado - mas isso não está acontecendo. O processo em segundo plano atua como se fosse disown
'ed.
Este é um esquema que desenho para ilustrar o assunto. O esquema, junto com a descrição acima, pode estar errado, já que tenho certeza de que não entendo bem o assunto. Por favor, corrija-me se for realmente o caso.
Eu quero saber por que o processo em segundo plano não está sendo eliminado depois de fechar o terminal, como se ele fosse invocado por um shell interativo como esse:
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
Não tenho certeza, mas acho que a resposta à minha pergunta está no fato de que Bash fork () é um shell não interativo para executar o script, que pode ter um conjunto diferente de regras para controle de tarefas e manipulação de sinais.