Por que meu processo remoto ainda é executado depois de encerrar uma sessão ssh?

15

Estou seguindo um arquivo de log remoto executando este comando em um shell local:

ssh remotemachine tail -100f /path/to/error_file

Quando ctrl-c fora desse comando, parece que o ctrl-c mata o processo ssh local e deixa minha cauda em execução na máquina remota. Fiquei com a impressão de que interromper a conexão enviaria um sinal de interrupção (já que não estou usando nohup) e acabaria com o processo, mas esse claramente não é o caso.

Alguém pode esclarecer um pouco mais quando os sinais de interrupção são enviados e quando não são? A máquina remota é o Ubuntu, e meu shell local é o OS X bash, se algum deles faz a diferença.

Ryan Olson
fonte

Respostas:

13

Esse comportamento decorre da falta de um terminal de controle para o processo em execução. Quando o processo remoto não possui um terminal de controle, o processo ssh remoto que gerencia a sua sessão não consegue interromper o comando, que fica pendurado em um estado de zumbi para ser limpo pelo init.

Você pode contornar isso executando-o com a opção -t, que fornece um terminal de controle. Isso fará com que o processo seja encerrado quando você pressionar Ctrl-c seu comando ssh remotamente.

A opção -t :

Forçar alocação pseudo-tty. Isso pode ser usado para executar programas arbitrários baseados em tela em uma máquina remota, o que pode ser muito útil, por exemplo, ao implementar serviços de menu. Várias opções -t forçam a alocação de tty, mesmo se ssh não tiver tty local.

Dê uma olhada no man ssh e man sshd ao usar esta opção, pois há outras implicações de se ter um terminal de controle, por exemplo, a capacidade de enviar caracteres de escape.

Nagul
fonte