Почему ssh ожидает мои подоболочки без -t и убивает их с -t?
У меня есть сценарий bash 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 user@host "start.sh"
Это работает, за исключением того, что послеstart.sh
ssh, по-видимому, также ожидает выхода из подоболочек. Я неЯ действительно не понимаю почему. однаждыstart.sh
выходы, подоболочки становятся дочерними для pid 1, и им даже не назначается tty ... так что я могуЯ не понимаю, как они все еще связаны с моим ssh-соединением.
Я позже попробовал это:
ssh -t user@host "start.sh"
Теперь процессы имеют назначенный псевдо-tty. Теперь я обнаружил, что ssh завершает работу, как толькоstart.sh
выходит, но это также убивает дочерние процессы.
Я предположил, что дочерние процессы отправляются SIGHUP в последнем случае, поэтому я сделал это:
ssh -t user@host "nohup start.sh"
Это на самом деле работает! Итак, у меня есть решение моей практической проблемы, но я хотел бы понять тонкости материала SIGHUP / tty здесь.
Итак, мои вопросы:
Почему ssh (без -t) ждет дочерних процессов даже послеstart.sh
выходит, даже если у них родительский pid 1?Почему ssh (с -t) уничтожает дочерние процессы, по-видимому, с помощью SIGHUP, даже если этого не происходит, когда я запускаю их из терминала и выхожу из этого терминала?