Ejecución del comando SSH de larga ejecución: ¿mejor estrategia?

2

Tengo un comando de larga ejecución que se está ejecutando sobre SSH. De vez en cuando, el comando parece colgar y dejar de obtener cualquier salida. El comando aún se está ejecutando en la otra máquina (de hecho, si presiona Ctrl + C fuera del comando SSH, aún se ejecuta, lo cual está bien), mi cliente simplemente se cuelga.

Mi comando está ejecutando un ant objetivo, como este:

ssh -tt user@machine 'cd /thedir; export DISPLAY=:80; ant clean test'

los ant El comando puede tardar hasta una hora.

Me imagino que esta es una mala estrategia, ya que pueden producirse errores en la red y estropear mi conexión. ¿Alguien puede sugerir un enfoque alternativo? Mi objetivo sería:

  1. Mi cliente espera a que termine el comando
  2. Todavía recibo salida del comando
  3. Si se producen fallos en la red, todavía puedo revisar y esperar a que finalice el comentario

Alguna ayuda o sugerencia será muy apreciada.

EDITAR: Estoy ejecutando un script bash completo ... No necesito una sola línea ni nada de eso.

Sean Adkinson
fuente
1
Puede ser útil usar 'pantalla', de modo que cuando se desconecte, simplemente pueda volver a conectarse a la sesión, reanudando su salida. gnu.org/software/screen
Frank Thomas
1
@FrankThomas - sí - agrega eso como respuesta. Ganar algunos votos
Doug Harris
Interesante, no estoy familiarizado con screen, y eso puede ser exactamente lo que estoy buscando. Voy a hacer algunas excavaciones.
Sean Adkinson

Respuestas:

2

Puede intentar ejecutar el comando en segundo plano (separado de su sesión de usuario) y enviarse el resultado por correo electrónico. Un poco así:

ssh -tt user@machine 'cd /thedir; nohup ant clean test 2>&1 | mail -s "The cleanup was completed." [email protected]'

Aunque no he probado esto

Der Hochstapler
fuente
Espero que la secuencia de comandos de mi cliente espere a que se complete el comando. Este sería un buen guión, así que sé cuándo se hace, pero mis objetivos son ligeramente diferentes.
Sean Adkinson
@BigSean: Bueno, el punto es que podría estar desconectado debido a "blips de red". Entonces, si no está conectado, ¿cómo se supone que su cliente debe esperar algo? Solo podía imaginar ir más complejo, como registrar un archivo y ver ese registro hasta que el comando se cierra y, en caso de que se desconecte, todavía tiene el registro. ¿O estoy malinterpretando el objetivo?
Der Hochstapler
Necesitaría el script para intentar volver a adjuntarlo o seguir revisándolo hasta que el script esté completo. El script se ejecuta en mi entorno de CI para cada registro de código, por lo que debo esperar a que el script se complete para que se ejecute el siguiente paso de compilación. Si el script falla, necesito que la compilación falle. Voy a actualizar la pregunta con más de estos detalles. Gracias
Sean Adkinson
@BigSean: En ese caso, escribiría algo mucho más complejo. Pero en última instancia, me gustaría lograr una solución que no dependa en absoluto de esta conexión SSH.
Der Hochstapler
2

Mi recomendación es usar una combinación de AutoSSH y la pantalla. autossh volverá a conectar automáticamente SSH si la sesión se desconecta, y la pantalla permite que su programa se ejecute independientemente de la sesión ssh para que pueda volver a conectarse a él en el proceso.

de esa manera, cuando su red tenga problemas, autossh se volverá a conectar y la pantalla volverá a unirse a su shell de scripts.

localhost>$ autossh -t remotehost 'screen -Rd'
remotehost>$ scriptname

de esa manera, cuando ssh muera, autossh volverá a conectarse y se volverá a conectar automáticamente a la sesión de pantalla.

http://noone.org/blog/English/Computer/Shell/Perfect%20Team:%20autossh%20and%20GNU%20Screen.html

Frank Thomas
fuente