Pregunta

Actualmente estoy intentando ingresar a una máquina remota y ejecutar un script, luego dejar el nodo con el script en ejecución. Debajo está mi guión. Sin embargo, cuando se ejecuta, el script se ejecuta con éxito en la máquina, pero la sesión ssh se bloquea. ¿Cuál es el problema?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
¿Fue útil?

Solución

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

por ejemplo: un script que se ejecuta en un cuadro que cuando se ejecuta

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

Usaría el siguiente comando:

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

@CKeven, puede poner todos esos comandos en un script, empujarlo al servidor remoto e iniciarlo de 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 &'

Espero que esto funcione ;-)

Editar: También puedes usar ssh user @ host 'screen -S SessionName -d -m " / path / to / ejecutable "'

Que crea una sesión de pantalla separada y ejecuta el comando de destino dentro de ella

Otros consejos

¿Qué piensa sobre el uso de la pantalla 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 sea ??útil, dependiendo de lo que haga concat).

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

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

Debería encontrar que el indicador vuelve inmediatamente y que concat.sh se está ejecutando en la máquina remota. Explicaré algunas de las opciones:

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

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

screen -r testing

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

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

Para mí, solo esto funcionó:

screen -dmS name sh my-script.sh

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

A continuación hay una decisión mucho más común que requirió algunos esfuerzos para encontrarla, y 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 user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

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

Tenga en cuenta un espacio en blanco al final -X cosas \ '' que se envía para superar la falla de una opción de 'cosas'. El espacio en blanco y $ theStuff en la siguiente línea se agregan con las teclas 'Enter' (^ M). ¡NO TE LO PIERDAS!

El " esta es una prueba " el mensaje se repite en la terminal inicial, y los comandos $ theStuff se ejecutan realmente dentro de la pantalla / pestaña mencionada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top