Encontrei isso na lista de problemas do github e acho que isso realmente responde à sua pergunta.
Não é realmente um problema de SSH, é mais o comportamento sutil dos modos não interativos / interativos do BASH e a propagação de sinais para grupos de processos.
A seguir, é baseado em
/programming/14679178/why-does-ssh-wait-for-my-subshells-without-t-and-kill-them-with-t/14866774#14866774
e http: //www.itp.uzh.ch/~dpotter/howto/daemonize , com algumas suposições não totalmente validadas, mas testes sobre como isso funciona parecem confirmar.
pty / tty = falso
O shell bash lançado se conecta ao stdout / stderr / stdin do processo iniciado e é mantido em execução até que não haja nada anexado aos soquetes e as crianças tenham saído. Um bom processo de deamon garantirá que não espere seus filhos saírem, bifurque um processo filho e saia. Quando neste modo, nenhum SIGHUP será enviado ao processo filho pelo SSH. Acredito que isso funcionará corretamente para a maioria dos scripts que executam um processo que lida com a desononização e não precisa ser em segundo plano. Onde os scripts init usam '&' para colocar em segundo plano um processo, é provável que o principal problema seja se o processo em segundo plano tenta ler do stdin, pois isso acionará um SIGHUP se a sessão for encerrada.
pty / tty = verdadeiro *
Se o script init colocar em segundo plano o processo iniciado, o shell BASH pai retornará um código de saída para a conexão SSH, que, por sua vez, procurará sair imediatamente, pois não está aguardando o término de um processo filho e não está bloqueado no stdout / stderr / stdin. Isso fará com que um SIGHUP seja enviado ao grupo de processos pai do shell bash, que, como o controle da tarefa está desativado no modo não interativo no bash, incluirá os processos filhos recém-lançados. Onde um processo daemon inicia explicitamente uma nova sessão de processo ao fazer uma bifurcação ou no processo de bifurcação, então ou seus filhos não receberão o SIGHUP do processo pai do BASH saindo. Observe que isso é diferente dos trabalhos suspensos, que verão um SIGTERM. Suspeito que os problemas em torno disso só funcionem às vezes tenham a ver com uma ligeira condição de corrida.
http://www.itp.uzh.ch/~dpotter/howto/daemonize , você verá que no código a nova sessão é criada pelo processo bifurcado, que pode não ser executado antes da saída do pai, resultando em uma aleatória comportamento de sucesso / falha mencionado acima. Uma declaração de suspensão permitirá tempo suficiente para o processo bifurcado criar uma nova sessão, e é por isso que funciona em alguns casos.
pty / tty = true e o controle do trabalho é explicitamente ativado no bash
O SSH não se conectará ao stdout / stderr / stdin do shell bash ou a qualquer processo filho iniciado, o que significa que ele será encerrado assim que o shell bash pai começar a executar os comandos solicitados. Nesse caso, com o controle da tarefa ativado explicitamente, todos os processos iniciados pelo shell bash com '&' para colocá-los em segundo plano serão colocados em uma sessão separada imediatamente e não receberão o sinal SIGHUP quando o processo pai da sessão BASH terminar ( Conexão SSH neste caso).
O que é necessário para corrigir
Acho que as soluções precisam ser mencionadas explicitamente na documentação de operações run / sudo como um caso especial ao trabalhar com processos / serviços em segundo plano. Basicamente, use 'pty = false' ou, quando isso não for possível, ative explicitamente o controle de tarefas como o primeiro comando, e o comportamento estará correto.
tomcat/bin/startup.sh
relacionado afg
/bg
?