He escrito un script que estoy usando para impulsar e implementar un nuevo servicio en varias máquinas bajo mi control, y para ejecutar el proceso estoy usando ssh para iniciar el proceso de forma remota. Desafortunadamente, cada vez que uso SSH para iniciar el proceso, el comando SSH nunca parece regresar, lo que hace que el script se detenga.
El comando se especifica como: ssh $ user @ $ host "/ root / command &". Cada vez que ejecuto comandos simples, como ps o who, el comando SSH regresa inmediatamente, sin embargo, cuando intento iniciar mi proceso, no regresa. He intentado trucos como envolver mi proceso en una secuencia de comandos bash simple que inicia el proceso y luego se cierra, sin embargo, esto también bloquea el comando SSH (incluso si la secuencia de comandos bash tiene un mensaje de éxito y sale normalmente).
¿Alguien tiene alguna idea de lo que está causando este comportamiento y cómo puedo hacer que el comando SSH regrese tan pronto como se haya iniciado el proceso?
Gracias por tus ideas!
Respuestas:
SSH conecta stdin, stdout y stderr del shell remoto a su terminal local, para que pueda interactuar con el comando que se ejecuta en el lado remoto.
Como efecto secundario, seguirá ejecutándose hasta que se hayan cerrado estas conexiones, lo que ocurre solo cuando el comando remoto y todos sus elementos secundarios (!) Han finalizado (porque los elementos secundarios, que es lo que inicia "&", heredan std * de su proceso principal y mantenerlo abierto).
Entonces necesitas usar algo como
<,> Y 2> & 1 redirigen stdin / stdout / stderr lejos de su terminal. El "&" luego hace que su script pase al fondo. En producción, por supuesto, redirigiría stdin / err a un archivo de registro adecuado.
Ver
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Editar:
Acabamos de descubrir que la
< /dev/null
anterior no es necesario (pero redirigir stdout / err es decir ). No tengo idea de por qué ...fuente
+1
! Funciona para mi. Y también puede imprimir la salida haciendo eco del archivo de registro:ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Podrías intentar nohup . Hombre nohup para más detalles.
Si desea mantener la salida en la máquina remota, aquí hay una variante .
fuente
Otra alternativa sería encender un desapegado
screen(1)
, algo como:Esto iniciará una pantalla separada (que captura toda la interacción dentro de ella) y luego regresará inmediatamente, finalizando la sesión ssh.
Con un poco más de ingenio, puede resolver llamadas de comandos remotos bastante complejas de esta manera.
fuente
fuente
Creo que la forma correcta sería
fuente