Após executar sleep 10 &
interativamente e fechar imediatamente o terminal de onde o comando foi executado, o sleep
comando termina antes de 10 segundos.
Mas quando esse comando é colocado em um script:
# this is a file named testfile.sh
sleep 10 &
e posteriormente executado como bash testfile.sh
, o sleep
comando persiste até a conclusão, mesmo após o terminal ser fechado.
Por que em um caso sleep
ele para logo após o terminal ser fechado, enquanto em outro ele continua executando?
No Bash,
&
inicia uma tarefa em segundo plano. Quando você fecha a janela do terminal, o emulador de terminal envia o sinal SIGHUP para o Bash, que por sua vez o encaminha para todas as tarefas, conforme explicado emman bash
:A ação padrão do SIGHUP é encerrar o processo, conforme explicado em
man 7 signal
:Mas quando você executa
sleep 10 &
um script run using,bash testfile.sh
você não executa uma tarefa e quando o processo pai - o script - sai, o processo sleep perde seu pai, é adotado pelo init (PID 1) e continua:Quando o Bash recebe o SIGHUP, ele não o encaminha para tarefas em segundo plano porque não há nenhuma - o testfile.sh não foi executado
&
e o sleep nem é mais um de seus processos descendentes.