Estou executando o comando abaixo e monitorando o arquivo de saída no outro sistema:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Se eu matar o comando ssh usando ^C
ou apenas matando o terminal no qual estou conectado, esperaria que o comando remoto também terminasse. Porém, isso não acontece: /tmp/count
obtém todos os números de 1 a 5 independentemente e ps -ejH
mostra o shell e seu sleep
filho continuando em execução.
Esse comportamento é esperado e está documentado em algum lugar? Posso desativá-lo? Pela leitura, eu esperava ter que habilitar explicitamente esse tipo de comportamento com nohup, não para que seja o padrão.
Dei uma olhada nas páginas de manual para ssh e sshd, mas não vi nada óbvio, e o Google me aponta instruções para ativar esse comportamento, não para desativá-lo.
Estou executando o Red Hat Enterprise Linux 6.2, com um login root e um shell bash nos dois sistemas.
-tt
vez de-t
se o próprio ssh não tiver um tty alocado. O SSH não receberá um tty alocado se o ssh ficar em segundo plano imediatamente após a chamada, por meio de opções como-f
ou-n
.Tente alocar um psuedo-tty com seu
ssh
comando.ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Quando você desconecta a sessão ssh, o processo deve terminar.
Como esse é um pseudo-tty, a inicialização do seu shell provavelmente não irá para os arquivos de configuração de origem, deixando seu comando com um ambiente muito simples. Pode ser necessário configurar um
.ssh/environment
arquivo que defina variáveis de ambiente, como PATH. A partir deman 1 ssh
fonte
Como alternativa ao uso da
-t
opção parassh
fazer com que o comando remoto seja encerrado quando ossh
cliente sai ou (é morto), um pipe nomeado pode ser usado para converter "EOF para SIGHUP" quando o stdin desshd
está sendo fechado (consulte o Bug 396 - sshd processos órfãos quando nenhum pty foi alocado ).fonte
Esta é a melhor maneira que encontrei para fazer isso. Você deseja algo no lado do servidor que tente ler stdin e, em seguida, mate o grupo de processos quando isso falhar, mas também deseje um stdin no lado do cliente que bloqueie até que o processo do lado do servidor seja concluído e não deixe processos remanescentes como <( infinito sono) pode.
Na verdade, ele não parece redirecionar o stdout para lugar nenhum, mas funciona como uma entrada de bloqueio e evita a captura de teclas.
Bug openssh relevante: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
fonte
Se você deseja desativar esse comportamento (aparentemente padrão), é necessário ativar o ssh-keep-alive no cliente ou no servidor.
Se você observar as opções ssh-keep-alive-nas páginas de manual, poderá ver que elas estão desativadas por padrão.
fonte
Minha resposta é baseada em teru. Eu preciso de um script auxiliar
~/helper
no servidor server.ip:Se for chamado, por exemplo, com
e executa
echo hello from server
em server.ip e, em seguida, o cliente ssh será encerrado.Se for chamado, por exemplo, com
kill -9 $CHID
irá parar o script no servidor também. Para mim,kill -INT $CHID
não funciona, mas não sei por quê.Na resposta do teru, o comando ssh aguardará para sempre quando o comando remoto for concluído, porque
cat
nunca termina.Todas as respostas com ssh -t não funcionaram para mim
kill
, mas apenas com Ctrl-C.Edit: Eu descobri que isso funcionou de um novo Ubuntu 14.01 para uma antiga caixa de linux científica - mas não o contrário. Portanto, acho que não há solução geral. Esquisito.
fonte