Citando la documentazione di bash (da 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.
Quindi, in parole povere, avere set -m
(il valore predefinito per le shell interattive) consente di utilizzare built-in come fg
e bg
, che sarebbe disabilitato in set +m
(valore predefinito per le shell non interattive).
Non è ovvio per me quale sia la connessione tra il controllo dei processi e l'uccisione dei processi in background all'uscita, tuttavia, posso confermare che ce n'è uno: l'esecuzione set -m; (sleep 10 ; touch control-on) &
creerà il file se si esce dalla shell subito dopo aver digitato quel comando, ma set +m; (sleep 10 ; touch control-off) &
non lo sarà.
Penso che la risposta risieda nel resto della documentazione per 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.
Ciò significa che i processi in background avviati set +m
non sono veri e propri "processi in background" ("I processi in background sono quelli il cui ID gruppo di processi differisce dal terminale"): condividono lo stesso ID gruppo di processi della shell che li ha avviati, piuttosto che avere il proprio gruppo di processi come i processi in background corretti. Questo spiega il comportamento osservato quando la shell si chiude prima di alcuni dei suoi processi in background: se capisco correttamente, quando si esce, un segnale viene inviato ai processi nello stesso gruppo di processi della shell (quindi uccidendo i processi in background iniziati sotto set +m
), ma non a quelli di altri gruppi di processi (lasciando così da soli i veri processi in background avviati set -m
).
Quindi, nel tuo caso, lo startup.sh
script avvia presumibilmente un processo in background. Quando questo script viene eseguito in modo non interattivo, ad esempio tramite SSH come nella domanda a cui si è collegati, il controllo del lavoro viene disabilitato, il lavoro "in background" condivide il gruppo di processi della shell remota e viene quindi ucciso non appena la shell esce. Al contrario, abilitando il controllo del lavoro in quella shell, il lavoro in background acquisisce il proprio gruppo di processi e non viene ucciso quando la shell madre esce.
tomcat/bin/startup.sh
correlato afg
/bg
?