Citando a documentação do bash (de man bash
):
JOB CONTROL
Job control refers to the ability to selectively stop
(suspend) the execution of processes and continue (resume)
their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly
by the operating system kernel's terminal driver and bash.
Então, simplesmente, ter set -m
(o padrão para shells interativos) permite que você use built-ins como fg
e bg
, que seriam desativados em set +m
(o padrão para shells não interativos).
No entanto, não é óbvio para mim qual é a conexão entre o controle de tarefas e a eliminação de processos em segundo plano na saída, mas posso confirmar que existe um: a execução set -m; (sleep 10 ; touch control-on) &
criará o arquivo se alguém sair do shell logo após digitar esse comando, mas set +m; (sleep 10 ; touch control-off) &
não o fará.
Eu acho que a resposta está no restante da documentação para set -m
:
-m Monitor mode. [...] Background pro‐
cesses run in a separate process group and a line con‐
taining their exit status is printed upon their comple‐
tion.
Isso significa que os trabalhos em segundo plano iniciados em set +m
não são "processos em segundo plano" reais ("Processos em segundo plano são aqueles cujo ID do grupo de processos difere do do terminal"): eles compartilham o mesmo ID do grupo de processos que o shell que os iniciou, em vez de ter seus próprios grupo de processos como processos adequados em segundo plano. Isso explica o comportamento observado quando o shell é encerrado antes de alguns de seus trabalhos em segundo plano: se eu entendi corretamente, ao sair, um sinal é enviado aos processos no mesmo grupo de processos que o shell (eliminando, assim, os trabalhos em segundo plano iniciados em set +m
), mas não àqueles de outros grupos de processos (deixando assim apenas os processos de segundo plano verdadeiros iniciados em set -m
).
Portanto, no seu caso, o startup.sh
script provavelmente inicia um trabalho em segundo plano. Quando esse script é executado de maneira não interativa, como no SSH, como na pergunta à qual você vinculou, o controle da tarefa é desabilitado, a tarefa "em segundo plano" compartilha o grupo de processos do shell remoto e, portanto, é eliminada assim que o shell sai. Por outro lado, ao ativar o controle da tarefa nesse shell, a tarefa em segundo plano adquire seu próprio grupo de processos e não é eliminada quando o shell pai sai.
tomcat/bin/startup.sh
relacionado afg
/bg
?Encontrei isso na lista de problemas do github e acho que isso realmente responde à sua pergunta.
Em https://github.com/fabric/fabric/issues/395
fonte