Citando a documentação do 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 disse: ter set -m
(o padrão para
shells interativos) permite que um use built-ins, como fg
e bg
,
que seria desativado em set +m
(o padrão para shells não interativos).
Não é óbvio para mim qual é a conexão entre o controle de tarefas e
matando processos de fundo na saída, no entanto, mas eu posso confirmar que
existe um: executando set -m; (sleep 10 ; touch control-on) &
criar o arquivo se um sai do shell logo depois de digitar esse
comando, mas set +m; (sleep 10 ; touch control-off) &
não vai.
Acho que a resposta está no restante da documentação de 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 as tarefas em segundo plano iniciadas em set +m
não são reais
"processos em segundo plano" ("Processos em segundo plano são aqueles cujo processo
ID do grupo difere do terminal "): eles compartilham o mesmo processo
ID do grupo como o shell que os iniciou, em vez de ter seus próprios
grupo de processos, como processos de fundo adequados. Isso explica o
comportamento observado quando a casca sai antes de alguns de seus antecedentes
jobs: se bem entendi, ao sair, um sinal é enviado para
os processos no mesmo grupo de processos que a casca (matando
trabalhos em segundo plano iniciados em set +m
), mas não para os de outros
grupos de processos (deixando, assim, apenas os verdadeiros processos em segundo plano iniciados
sob set -m
).
Portanto, no seu caso, o script startup.sh
presumivelmente inicia um
trabalho de fundo. Quando esse script é executado de forma não interativa, como
sobre SSH como na pergunta que você vinculou, o controle de trabalho está desabilitado,
o job "background" compartilha o grupo de processos do shell remoto e
é assim morto assim que a shell sai. Por outro lado, ativando o trabalho
controle nesse shell, o job em segundo plano adquire seu próprio processo
grupo, e não é morto quando seu shell pai sai.