Eu escrevi um script que estou usando para enviar e implantar um novo serviço em várias máquinas sob meu controle e, para executar o processo, estou usando o ssh para iniciar remotamente o processo. Infelizmente, sempre que eu uso o SSH para iniciar o processo, o comando SSH parece nunca retornar, causando a interrupção do script.
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 sai, no entanto, isso também trava o comando SSH (mesmo que o script bash faça eco de uma mensagem de sucesso e saia normalmente).
Alguém tem alguma idéia do que está causando esse comportamento e como posso obter o comando SSH para retornar assim que o processo foi iniciado?
Obrigado por suas idéias!
Respostas:
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á sendo executado até que essas conexões sejam fechadas, o que ocorre apenas quando o comando remoto e todos os seus filhos (!) Foram finalizados (porque os filhos, que é o que "&" inicia, herdam std * de seus processo pai e mantenha-o aberto).
Então você precisa usar algo como
Os <,> e 2> & 1 redirecionam stdin / stdout / stderr para longe do seu terminal. O "&" faz com que seu script vá para segundo plano. Na produção, é claro que você redirecionaria stdin / err para um arquivo de log adequado.
Vejo
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Editar:
Acabei de descobrir que o
< /dev/null
acima não é necessário (mas redirecionar stdout / err é ). Não faço ideia porque ...fonte
+1
! Funciona para mim. E você também pode imprimir a saída ecoando o arquivo de log:ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Você pode tentar nohup . Homem nohup para mais detalhes.
Se você deseja manter a saída na máquina remota, aqui está uma variante .
fonte
Outra alternativa seria iniciar um desanexado
screen(1)
, algo como: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 habilidade, você pode resolver chamadas de comandos remotos bastante complexas dessa maneira.
fonte
fonte
Eu acho que a maneira correta seria
fonte