Executando um comando de execução longa no ssh

10

Estou sshentrando em um servidor e iniciando um script Python que levará aprox. 24 horas para concluir. E se a minha conexão à Internet morrer no meio? Isso vai parar o comando?

Existe alguma maneira de executar meu comando de longa duração de uma maneira que as desconexões locais não o afetem e eu possa continuar vendo sua saída depois de fazer login sshnovamente?

Ram Rachum
fonte

Respostas:

29

A melhor maneira é usar screen(no servidor) para iniciar uma sessão para executar o comando e desconectar a tela para continuar funcionando, e você pode fazer outras coisas ou simplesmente desconectar o servidor. A outra opção é usar nohupem combinação com, &para que você tenhanohup <command> &

Zypher
fonte
Tela. Ou você pode configurar uma tarefa cron se for algo que você execute mais de uma vez.
xeon
2
Se você for desconectado enquanto estiver sendo executado na tela, screen -rvocê será reconectado.
dpflug
2

Você também pode usar disownse você já iniciou o processo sem screenounohup

Robert Swisher
fonte
2

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 até mesmo nohup! Então, graças ao tbc0 no SO ( link ), encontrei esta jóia. Ele retorna imediatamente, mas o processo do servidor continua em execução:

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:

  • >&- - feche o identificador stdout
  • 2>&- - fechar stderr
  • <&- - fechar stdin
  • & - colocar o processo em segundo plano

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

cor
fonte
1

Se você criar um plano de fundo para um processo e encerrar 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 o processo pai agora é 1 (init).

Como alternativa, você pode configurar seu script como faria com um daemon. Uma pesquisa rápida mostra esse link aparentemente útil: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Se você quiser adotar essa abordagem.

user51359
fonte