2009-10-27 11 views
20

Actualmente estoy intentando enviar ssh a una máquina remota y ejecutar un script, luego dejar el nodo con el script en ejecución. A continuación está mi script. Sin embargo, cuando se ejecuta, el script se ejecuta correctamente en la máquina, pero la sesión de ssh se bloquea. ¿Cuál es el problema?cómo ejecutar un comando en segundo plano utilizando ssh y desconectar la sesión

ssh -x [email protected]$node 'rm -rf statuslist 
         mkdir statuslist 
         chmod u+x ~/monitor/concat.sh 
         chmod u+x ~/monitor/script.sh 
         nohup ./monitor/concat.sh & 
         exit;' 

Respuesta

24

Existen algunas situaciones en las que desea ejecutar/iniciar algunos scripts en una máquina/servidor remoto (que terminará automáticamente) y desconectarse del servidor.

por ejemplo: Una secuencia de comandos que se ejecutan en una caja que cuando se ejecuta

  1. toma un modelo y lo copia en un servidor remoto
  2. crea una secuencia de comandos para ejecutar una simulación con el modelo y lo empuja al servidor
  3. inicia la secuencia de comandos en el servidor y desconecta
  4. El deber del script iniciado es ejecutar la simulación en el servidor y una vez completada (tardará días en completarse) copia los resultados al cliente.

me gustaría utilizar el siguiente comando:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

@CKeven, puede poner todos los comandos en un script, empujarlo al servidor remoto e iniciar la siguiente manera:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

Hope esto funciona ;-)

Editar: también puede utilizar ssh usuario @ host pedregal' n -S SessionName -d -m "/ ruta/a/ejecutable"'

que crea una sesión de pantalla separada y se ejecuta comando de destino dentro de ella

+0

¿Qué sucede si el comando que está ejecutando requiere entrada de un archivo (como una importación de db grande, por ejemplo, mysql cayblood

4

Podría ser el flujo de entrada estándar. Pruebe ssh -n ... o ssh -f ....

+0

Niza. Gracias.' ssh -f "user @ host DISPLAY = myhost: 0.0 qtcreator &" ' – kyb

21

¿Qué opinas sobre el uso de screen para esto? Puede ejecutar screen a través de ssh para iniciar el comando (concat.sh) y luego podrá volver a la sesión de pantalla si desea monitorearlo (podría ser útil, dependiendo de lo que haga Concat).

Para ser más específicos, intente esto:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh 

usted debe encontrar que los vuelve a aparecer de inmediato, y que concat.sh se está ejecutando en la máquina remota. Explicaré algunas de las opciones:

  • ssh -t hace un TTY. la pantalla necesita esto
  • screen -dm hace que comience en modo "desconectado". Esto es como "fondo" para sus propósitos.
  • -S prueba le da un nombre a su sesión de pantalla. Es opcional pero recomendado.

Ahora, una vez que haya hecho esto, se puede ir a la máquina remota y ejecutar este:

screen -r testing 

Esto va a adjuntar a la sesión de pantalla que contiene el programa. Desde allí puedes controlarlo, matarlo, ver su salida, etc. Ctrl-A, luego d lo desconectará de la sesión de pantalla. screen -ls listará todas las sesiones en ejecución.

+0

¿te importa decirme explícitamente cómo hacer esto? –

+2

@John Zwinck, ¿esto definitivamente funcionó para ti? El siguiente comando d oes no funciona para mí: pantalla ssh -t HOST "-dm -Sleep Sleep 10". Simplemente dice "Conexión a HOST cerrado" y cuando inicio sesión en el servidor no hay pantallas separadas. – richardkmiller

+4

@richardkmiller: Cuando lo probé, ahora tengo el mismo (mal) resultado que tú. Cambié la opción '-t' a ssh para que fuera' -f' en su lugar, para que oriente el comando (y no asigne un TTY), y luego funcionó. Sospecho que algo cambió en los últimos 2 años de Linux desde que escribí esta respuesta ... intente con la pantalla 'ssh -f HOST" -dm -Sleep Sleep 10 "' y puede encontrar que funciona ahora. –

0

Para mí, sólo que esta trabajado:

screen -dmS name sh my-script.sh 

Esto, por supuesto, depende de la pantalla, y le permite adjuntarlo más tarde, si alguna vez quiere stdin o stdout. La pantalla se terminará cuando my-script.sh finalice.

0

A continuación es una decisión mucho más común que requiere algunos esfuerzos para encontrar, y lo que realmente funciona para mí:

#!/usr/bin/bash 
theScreenSessionName="test" 
theTabNumber="1" 
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top" 

echo "this is a test" 

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff 
\"" 

envía la lista $ theStuff de comandos a la pestaña No $ theTabNumber de la sesión de pantalla $ theScreenSessionName creado preliminarmente en el 'servidor' en nombre de 'usuario'.

favor consciente de un espacio en blanco final después -X cosas \" que se envía a superar fallo de una opción de 'cosas'. El espacio en blanco y $ theStuff en la línea siguiente se adjuntan, a 'Enter' (^ M) pulsaciones de teclas. NO TE PIERDAS 'EM!

el 'esto es una prueba' mensaje se repite en el terminal inicial, y $ theStuff comandos son realmente ejecutado dentro de la pantalla/pestaña mencionado.

Cuestiones relacionadas