Usando o SSH para iniciar remotamente um processo

18

Eu escrevi um script que estou usando para enviar e implantar um novo serviço para várias máquinas sob meu controle e, para executar o processo, estou usando o ssh para iniciar o processo remotamente. Infelizmente, sempre que uso o SSH para iniciar o processo, o comando SSH nunca parece retornar, fazendo com que o script pare.

O comando é especificado como: ssh $ user @ $ host "/ root / command &". Sempre que executo comandos simples, como ps ou who, o comando SSH retorna imediatamente, no entanto, quando tento iniciar meu processo, ele não retorna. Eu tentei truques como agrupar meu processo em um script bash simples que inicia o processo e, em seguida, sai, no entanto, isso também trava o comando SSH (mesmo se o script bash ecoa uma mensagem de sucesso e sai normalmente).

Alguém tem alguma ideia do que está causando esse comportamento e como posso obter o retorno do comando SSH assim que o processo for iniciado?

Obrigado pelas suas ideias!

    
por rmrobins 06.07.2009 / 17:21

5 respostas

28

O SSH conecta stdin, stdout e stderr do shell remoto ao seu terminal local, para que você possa interagir com o comando que está sendo executado no lado remoto.

Como efeito colateral, ele continuará funcionando até que essas conexões tenham sido fechadas, o que acontece somente quando o comando remoto e todos os seus filhos (!) tiverem terminado (porque os filhos, que é o que "&" inicia, herdam std * do processo pai e mantenha-o aberto).

Então você precisa usar algo como

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

As tags & lt ;, > e 2 > & 1 redirecionam o stdin / stdout / stderr para longe do seu terminal. O "&" então faz seu script ir para o segundo plano. Na produção, você naturalmente redirecionaria o stdin / err para um arquivo de log adequado.

Veja

link

Editar:

Acabei de descobrir que o < /dev/null acima não é necessário (mas redirecionar stdout / err é ). Não faço ideia do porquê ...

    
por 06.07.2009 / 17:44
5

Você pode tentar nohup . Man nohup para mais detalhes.

ssh host "nohup script &"

Se você quiser manter a saída na máquina remota, aqui está uma variante .

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'
    
por 06.07.2009 / 18:15
5

Outra alternativa seria acionar um screen(1) desanexado, algo como:

ssh -l user host "screen -d -m mycommand"

Isso iniciará uma tela desanexada (que captura toda a interação dentro dela) e retornará imediatamente, encerrando a sessão ssh.

Com um pouco mais de criatividade, você pode resolver chamadas de comandos remotos bastante complexas dessa maneira.

    
por 06.07.2009 / 21:53
4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.
    
por 06.07.2009 / 17:30
-1

Eu acho que a maneira correta seria

ssh user@host exec script.sh &
    
por 06.07.2009 / 17:32

Tags