Почему 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, даже если этого не происходит, когда я запускаю их из терминала и выхожу из этого терминала?

Ответы на вопрос(3)

Ваш ответ на вопрос