Cytując dokumentację bash (od 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.
Tak więc, mówiąc najprościej, posiadanie set -m
(domyślnie dla interaktywnych powłok) pozwala na użycie wbudowanych funkcji, takich jak fg
i bg
, które byłyby wyłączone w set +m
(domyślnie dla nieinteraktywnych powłok).
Jednak nie jest dla mnie oczywiste, jaki jest związek między kontrolą zadań a zabijaniem procesów w tle przy wyjściu, ale mogę potwierdzić, że istnieje: uruchomienie set -m; (sleep 10 ; touch control-on) &
utworzy plik, jeśli wyjdzie z powłoki zaraz po wpisaniu tego polecenia, ale set +m; (sleep 10 ; touch control-off) &
nie zrobi tego.
Myślę, że odpowiedź leży w pozostałej części dokumentacji 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.
Oznacza to, że zadania uruchomione w tle set +m
nie są rzeczywistymi „procesami w tle” („Procesy w tle to te, których identyfikator grupy procesów różni się od terminala”): mają ten sam identyfikator grupy procesów co powłoka, która je uruchomiła, zamiast mieć własne grupa procesów jak właściwe procesy w tle. Wyjaśnia to zachowanie obserwowane, gdy powłoka kończy pracę przed niektórymi zadaniami w tle: jeśli dobrze rozumiem, po wyjściu sygnał jest wysyłany do procesów w tej samej grupie procesów co powłoka (zabijanie zadań w tle rozpoczęło się poniżej set +m
), ale nie do tych z innych grup procesów (pozostawiając w ten sposób prawdziwe procesy w tle rozpoczęte pod set -m
).
W twoim przypadku startup.sh
skrypt prawdopodobnie rozpoczyna pracę w tle. Gdy ten skrypt jest uruchamiany w sposób nieinteraktywny, na przykład przez SSH, jak w pytaniu, do którego się łączysz, kontrola zadań jest wyłączona, zadanie „w tle” dzieli grupę procesów zdalnej powłoki, a zatem zostaje zabite, gdy tylko powłoka zostanie zamknięta. I odwrotnie, poprzez włączenie kontroli zadań w tej powłoce, zadanie w tle nabywa własną grupę procesów i nie jest zabijane po wyjściu powłoki macierzystej.
tomcat/bin/startup.sh
dofg
/bg
?Znalazłem to na liście problemów github i myślę, że to naprawdę odpowiada na twoje pytanie.
Od https://github.com/fabric/fabric/issues/395
źródło