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.


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." your-email@exmaple.com'

Aunque no he probado esto


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.