Цитирование документации bash (из 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.
Таким образом, проще говоря, наличие set -m
(по умолчанию для интерактивных оболочек) позволяет использовать встроенные модули, такие как fg
и bg
, которые будут отключены в set +m
(по умолчанию для неинтерактивных оболочек).
Однако для меня не очевидно, какова связь между управлением заданиями и уничтожением фоновых процессов при выходе, но я могу подтвердить, что есть одно: запуск set -m; (sleep 10 ; touch control-on) &
создаст файл, если он выйдет из оболочки сразу после ввода этой команды, но set +m; (sleep 10 ; touch control-off) &
не будет.
Я думаю, что ответ лежит в остальной документации для 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.
Это означает, что фоновые задания, запущенные под set +m
, не являются фактическими «фоновыми процессами» («Фоновые процессы - это те, чей идентификатор группы процессов отличается от идентификатора терминала»): они имеют тот же идентификатор группы процессов, что и оболочка, которая их запустила, а не имеют свои собственные группа процессов, как правильные фоновые процессы. Это объясняет поведение, наблюдаемое при выходе из оболочки перед некоторыми из ее фоновых заданий: если я правильно понимаю, при выходе сигнал отправляется процессам в той же группе процессов, что и оболочка (таким образом, уничтожение фоновых заданий, запущенных в set +m
), но не к тем из других групп процессов (таким образом, оставляя в покое истинные фоновые процессы, запущенные под set -m
)
Итак, в вашем случае startup.sh
скрипт предположительно запускает фоновое задание. Когда этот сценарий выполняется неинтерактивно, например, через SSH, как в вопросе, с которым вы связаны, управление заданиями отключается, «фоновое» задание разделяет группу процессов удаленной оболочки и, таким образом, уничтожается при выходе из оболочки. И наоборот, включив управление заданиями в этой оболочке, фоновое задание получает свою собственную группу процессов и не уничтожается при выходе из родительской оболочки.
tomcat/bin/startup.sh
связано сfg
/bg
?Я нашел это в списке вопросов GitHub, и я думаю, что это действительно ответит на ваш вопрос.
С https://github.com/fabric/fabric/issues/395
источник