Fazendo um comando de longa duração no ssh

9

Estou ssh em um servidor e estou iniciando um script Python que demora aprox. 24 horas para concluir. E se minha conexão com a internet morrer no meio? Isso vai parar o comando?

Existe alguma maneira de executar o meu comando de longa duração de forma que as desconexões locais não o afetem e eu poderia continuar a ver sua saída depois de logar em ssh novamente?

    
por Ram Rachum 19.08.2010 / 21:38

4 respostas

26

A melhor maneira é usar screen para iniciar uma sessão para executar o comando e, em seguida, desconectar a tela para que ela continue em execução, e você pode fazer outras coisas ou simplesmente se desconectar do servidor. A outra opção é usar nohup em combinação com & , então você teria nohup <command> &

    
por 19.08.2010 / 21:44
2

Você também pode usar disown se já tiver iniciado o processo sem screen ou nohup

    
por 19.08.2010 / 23:26
1

Se você contextualizar um processo & feche sua sessão o processo será adotado pelo init (PID 1).

Se eu tiver uma sessão e fizer:

]$ sleep 10000 &
]$ exit

e abra outra sessão e execute:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

Meu processo ainda está em execução e vemos que seu processo pai agora é 1 (init).

Como alternativa, você pode configurar seu script como se fosse um daemon. Uma pesquisa rápida mostra este link aparentemente útil: link . Se você quisesse adotar essa abordagem.

    
por 19.08.2010 / 21:53
0

As respostas existentes podem funcionar bem, mas eu precisava de algo para o BusyBox (um shell e um conjunto de ferramentas para hardware mínimo, como roteadores domésticos). Meu sistema não tem screen , dtach , at , disown ou mesmo nohup ! Então, graças a tbc0 em SO ( link ), encontrei esta jóia. Ele retorna imediatamente, mas o processo do servidor continua a ser executado:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

Ou, se vários comandos forem necessários:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

Explicação:

  • >&- - fecha a manivela stdout
  • 2>&- - fechar stderr
  • <&- - fechar stdin
  • & - colocar o processo em segundo plano

Isso não usa programas externos e deve funcionar em ksh, ash, Bourne shell, bash, etc.

    
por 12.11.2018 / 18:06

Tags