Por que o SSH não espera por processos em segundo plano?

12

Por que é que ssh -t não espera que os trabalhos em segundo plano sejam concluídos?

Exemplo:

ssh user@example 'sleep 2 &'

Isso funciona como esperado, pois o ssh retorna após 2 segundos, enquanto

ssh user@example -t 'sleep 2 &'

não espera que sleep termine e retorne imediatamente.

Alguém pode explicar a razão por trás disso? Existe uma maneira de deixar ssh -t esperar que todos os processos em segundo plano sejam concluídos antes de retornar?

Meu caso de uso é que eu inicio um script com ssh -t e esse script inicia várias tarefas em segundo plano que devem permanecer ativas após o script principal terminar. Com ssh -t isso não é possível até agora.

    
por Philipp Murry 21.02.2017 / 12:37

2 respostas

21

Sem -t , sshd obtém o stdout do shell remoto (e filhos como sleep ) e stderr através de dois canais (e também envia a entrada do cliente por meio de outro canal).

sshd espera pelo processo no qual iniciou o shell de login do usuário, mas também, após esse processo ter terminado, espera por eof no stdout pipe (não no stderr pipe no caso do openssh, pelo menos).

E eof acontece quando não há descritor de arquivo por qualquer processo aberto no final da escrita do pipe, o que geralmente acontece quando todos os processos que não tiveram seu stdout redirecionado para outra coisa desapareceram.

Quando você usa -t , sshd não usa pipes. Em vez disso, toda a interação (stdin, stdout, stderr) com o shell remoto e seus filhos é feita usando um par pseudo-terminal.

Com um par de pseudo-terminais, para sshd interagindo com o lado mestre, não há nenhum tratamento similar ou qualquer maneira de saber se ainda há processos com fds abertos para o lado escravo do pseudo-terminal, então apenas aguarda o término do processo no qual ele executou o shell de login do usuário remoto e então sai.

Após essa saída, o lado mestre do par pty é fechado, o que significa que a pty é destruída, então os processos controlados pelo escravo receberão um SIGHUP (que, por padrão, os terminaria).

    
por 21.02.2017 / 14:10
5

Use wait :

ssh user@example -t 'sleep 2 & wait'
    
por 21.02.2017 / 13:51