У меня есть bash script start.sh, который выглядит следующим образом:
for thing in foo bar; do
{
background_processor $thing
cleanup_on_exit $thing
} &
done
Это делает то, что я хочу: я запускаю start.sh, он выходит с кодом 0, и две подоболочки работают в фоновом режиме. Каждая подоболочка работает background_processor
, и, когда она завершается, выполняется cleanup_on_exit
. Это работает, даже если я выхожу из терминала, с которого я изначально запускал start.sh(даже если это было ssh-соединение).
Затем я попробовал это:
ssh [email protected] "start.sh"
Это работает, за исключением того, что после выхода start.sh
ssh, судя по всему, также ждет завершения работы подоболочек. Я не понимаю, почему. Как только start.sh
завершается, подоболочки становятся дочерними элементами pid 1, и они даже не назначаются с помощью tty... поэтому я не могу понять, как они все еще связаны с моим ssh-соединением.
Я позже попытался:
ssh -t [email protected] "start.sh"
Теперь процессы имеют назначенное псевдо-tty. Теперь я обнаружил, что ssh завершает работу, как только start.sh
завершает работу, но также убивает дочерние процессы.
Я предположил, что дочерние процессы отправляются SIGHUP в последнем случае, поэтому я сделал это:
ssh -t [email protected] "nohup start.sh"
Это действительно работает! Итак, у меня есть решение моей практической проблемы, но я хотел бы понять тонкости материала SIGHUP/tty здесь.
В заключение, мои вопросы:
- Почему ssh (без -t) ждет, пока дочерний процесс завершится даже после завершения
start.sh
, хотя у них есть родительский pid 1? - Почему ssh (с -t) убивает дочерние процессы, по-видимому, с SIGHUP, хотя этого не происходит, когда я запускаю их с терминала и выхожу из этого терминала?