21 votos

Uso de SSH para iniciar un proceso de forma remota

He escrito un script que estoy usando para promover e implementar un nuevo servicio a varias máquinas de bajo mi control, y en orden a ejecutar el proceso estoy usando ssh de forma remota iniciar el proceso. Por desgracia, cada vez que puedo usar SSH para iniciar el proceso, el comando SSH nunca parece regresar, causando la secuencia de comandos para el puesto.

El comando se especifica como: ssh $user@$host "/root/command &". Siempre que puedo ejecutar comandos simples, tales como el ps o que, el comando SSH devuelve de inmediato, sin embargo cuando intento iniciar mi proceso de no retorno. He tratado de trucos como la envoltura de mi proceso en un sencillo script en bash que inicia el proceso y, a continuación, sale, sin embargo, esto también se bloquea el comando SSH (incluso si la secuencia de comandos bash echos un mensaje de éxito, y sale de la normalidad).

¿Alguien tiene alguna idea de lo que es la causa de este comportamiento, y cómo puedo conseguir el comando SSH para volver tan pronto como el proceso que se ha iniciado?

Gracias por tus apreciaciones!

31voto

sleske Puntos 5824

SSH se conecta stdin, stdout y stderr de la shell remota a su local de la terminal, así que usted puede interactuar con el comando que se ejecuta en el lado remoto.

Como efecto secundario, va a seguir funcionando hasta que estas conexiones se han cerrado, que sólo ocurre cuando el mando a distancia y todos sus hijos (!) han terminado (porque los niños, que es lo "&" comienza heredar sexual* de sus padres, de proceso y mantenerlo abierto).

Por lo que necesita usar algo como

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

La <, > y 2>&1 redirigir la entrada estándar stdin/stdout/stderr lejos de su terminal. El"&", a continuación, hace que su secuencia de comandos de ir al fondo. En la producción de usted, por supuesto, redirigir la entrada estándar stdin/err para un adecuado archivo de registro.

Ver

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

Editar:

Acaba de enterarse de que el < /dev/null de arriba no es necesario (pero redirigir stdout/err es). Ni idea de por qué...

7voto

Jauder Ho Puntos 3172

Usted podría tratar de nohup. Hombre nohup para obtener más detalles.

ssh host "nohup script &"

Si desea mantener la salida en la máquina remota, esta es una variante.

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

6voto

towo Puntos 1330

Otra alternativa sería que el fuego de un desprendimiento screen(1), algo como:

ssh -l user host "screen -d -m mycommand"

Esto iniciará un desprendimiento de la pantalla (que capta la interacción dentro de ella) y, a continuación, devolver inmediatamente, la terminación de la sesión de ssh.

Con un poco más de ingenio, puede resolver algo bastante complejo de comando remoto de llamadas de esta manera.

4voto

GvS Puntos 28137
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to "yes",
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

-1voto

nik Puntos 5456

Creo que la forma correcta sería

ssh user@host exec script.sh &

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: