Hacer un comando de larga duración en ssh

10

Estoy sshing en un servidor y estoy empezando un script en Python que va a tomar aprox. 24 horas para completar. ¿Qué pasa si mi conexión a internet se corta en el medio? ¿Eso detendrá el comando?

¿Hay alguna forma de ejecutar mi comando de ejecución prolongada de manera que las desconexiones locales no lo afecten y pueda continuar viendo su salida después de iniciar sesión sshnuevamente?

Ram Rachum
fuente

Respuestas:

29

La mejor manera es usar screen(en el servidor) para iniciar una sesión para ejecutar el comando y luego desconectar la pantalla para que siga ejecutándose, y puede hacer otras cosas, o simplemente desconectarse del servidor. La otra opción es usar nohupen combinación con &lo que tendríanohup <command> &

Zypher
fuente
Pantalla. O puede configurar una tarea cron si es algo que ejecuta más de una vez.
xeon
2
Si se desconecta mientras se está ejecutando en la pantalla, screen -rlo reconectará.
dpflug
2

También puede usar disownsi ya ha comenzado el proceso sin screenonohup

Robert Swisher
fuente
2

Las respuestas existentes pueden funcionar bien, pero necesitaba algo para BusyBox (un shell y un conjunto de herramientas para hardware mínimo como enrutadores domésticos). Mi sistema no tiene screen, dtach, at, disown, o incluso nohup! Así que gracias a tbc0 en SO ( enlace ), encontré esta joya. Regresa inmediatamente pero el proceso del servidor continúa ejecutándose:

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

O, si se necesitan múltiples comandos:

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

Explicación:

  • >&- - cierre manija stdout
  • 2>&- - cerrar stderr
  • <&- - cerrar stdin
  • & - poner el proceso en segundo plano

Esto no utiliza programas externos y debería funcionar en ksh, ash, Bourne shell, bash, etc.

cor
fuente
1

Si crea un proceso en segundo plano y cierra su sesión, el proceso será adoptado por init (PID 1).

Si tengo una sesión y hago:

]$ sleep 10000 &
]$ exit

y abra otra sesión y ejecute:

]$ 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

Mi proceso todavía se está ejecutando, y vemos que su proceso padre ahora es 1 (init).

Alternativamente, puede configurar su script como lo haría con un demonio. Una búsqueda rápida muestra este enlace aparentemente útil: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Si quisieras tomar ese enfoque.

usuario51359
fuente