Por que o ssh espera por meus subshells sem -t e os mata com -t?

Eu tenho um script bash start.sh que se parece com isso:

for thing in foo bar; do
    {
        background_processor $thing
        cleanup_on_exit $thing
    } &
done

Isso faz o que eu quero: eu corro start.sh, ele sai com o código 0 e os dois subshells são executados em segundo plano. Cada subshell é executadobackground_processor, e quando isso sai, ele é executadocleanup_on_exit. Isso funciona mesmo se eu sair do terminal do qual eu originalmente executei o start.sh (mesmo que fosse uma conexão ssh).

Então eu tentei isso:

ssh user@host "start.sh"

Isso funciona, exceto que depoisstart.sh tenha saído, ssh aparentemente também aguarda que as subshells saiam. Eu não entendo o porque. Uma vezstart.sh exits, as subshells se tornam filhos de pid 1, e eles nem sequer são designados com um tty ... então não consigo entender como eles ainda estão associados à minha conexão ssh.

Mais tarde tentei isso:

ssh -t user@host "start.sh"

Agora os processos têm uma pseudo-tty atribuída. Agora, eu acho que o ssh sai assim questart.sh sai, mas também mata os processos filhos.

Eu imaginei que os processos filhos estavam sendo enviados SIGHUP no último caso, então eu fiz isso:

ssh -t user@host "nohup start.sh"

Isso realmente funciona! Então, eu tenho uma solução para o meu problema prático, mas eu gostaria de entender as sutilezas do SIGHUP / tty aqui.

Em resumo, minhas perguntas são:

Por que o ssh (sem -t) espera pelos processos filhos mesmo depoisstart.sh saídas, mesmo que tenham pai pid 1?Por que o ssh (with -t) mata os processos filhos, aparentemente com um SIGHUP, mesmo que isso não aconteça quando eu os executar de um terminal e sair desse terminal?

questionAnswers(3)

yourAnswerToTheQuestion