Ejecute un comando nohup sobre SSH, luego desconecte

46

Quiero ejecutar un script, start.shen un servidor remoto que ejecuta esto:

nohup node server.js &

Ingenuamente, llamo a SSH así:

ssh myserver <<EOF
./start.sh &
EOF

Esto inicia el script, pero deja la sesión conectada. Quiero seguir este paso con otros comandos en un script, por lo que no es bueno.

¿Cómo puedo enviar SSH a la máquina remota, iniciar un nohupcomando en segundo plano y luego desconectarme? Supongo que podría poner el proceso SSH en segundo plano, pero eso no parece correcto.

Steve Bennett
fuente

Respuestas:

40

Ya has encontrado el camino correcto, aquí documenta.

NOTA : puede poner el ssh (cliente) en segundo plano colocando un & al final, pero no verá el resultado. Si realmente desea hacer esto, redirija el stdout / stderr a un archivo en caso de que necesite verificar la respuesta del host remoto.

Básicamente puedes hacerlo de cualquier manera:

Ejecute directamente el comando {, s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

O

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

NOTA : &&requiere que el primer comando devuelva 0 antes de ejecutar el segundo

Use aquí el documento

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

Las 3 opciones anteriores deberían funcionar para usted.

Además, eche un vistazo a la respuesta aquí: https://askubuntu.com/a/348921/70270

Terry Wang
fuente
Gracias, así que lo que me faltaba era realmente el > /dev/null.
Steve Bennett
En realidad no, > /dev/null 2>&1es descartar cualquier salida stdout / stderr redirigiendo al agujero negro lol
Terry Wang
55
Tenga en cuenta que sugeriría usar >> en lugar de solo> para escribir en los archivos de registro. De lo contrario, solo obtendrá los errores de la última ejecución.
Alexis Wilke
¿Es correcto que si simplemente inicio un comando como nohup command2 >> /path/to/command2.log 2>&1 &en un terminal y luego cierro el terminal que se pierde el proceso?
Lucas
1
@TerryWang el segundo ejemplo no funcionará con ampersand seguido de doble ampersand, vea unix.stackexchange.com/q/67006/86716
tsionyx
7

¿Por qué no simplemente tmux o screen y listo? Por ejemplo:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Esto es práctico si es algo que se repetirá continuamente o tardará un tiempo en terminar. Puede desconectarse de la sesión y permanecerá activa.

Luego
fuente
2
Realmente no se ajusta a lo que estoy pidiendo, que es un solo comando que se puede ejecutar en mi computadora portátil, que se conectará, bifurcará un comando y luego se desconectará.
Steve Bennett
3
ssh node "nohup sleep 10 &"

no se ejecuta en modo daemon, manteniendo conectada su sesión ssh. La sesión de Ssh volverá en 10 segundos, a pesar de que usó nohup.

La razón es que stdout y stderr remotos todavía están conectados a su sesión. Mantiene la sesión ssh viva, nohup no ayuda.

Esta:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

vuelve de inmediato. Inicia el proceso remoto con nohup y sale de la sesión ssh de inmediato.

Sergey Cherepanov
fuente
Este fue exactamente nuestro problema. Solo teníamos un 1> file.log. El ssh en la única máquina estaba atascado. El proceso en la máquina 'nodo' se estaba ejecutando. Cuando agregamos un 2> & 1 justo antes del cierre &, eso permite que el ssh se desconecte.
Lee Meador
2

Forma más corta:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Parece que bash mismo realiza la desconexión de la terminal, por lo que no se necesita nohup. Ejecuto Ubuntu 14.04 x86_64, bash 4.3.11.

Alek_A
fuente
1
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente reputación podrá comentar cualquier publicación . - De la opinión
David Foerster
Esto no parece funcionar. nohup; solo genera una queja sobre la falta de argumentos.
Steve Bennett
@DavidFoerster, no tengo idea de por qué, si command 1; command 2; ...representa el script OP, quiero ejecutarlo. OP también puede usar un caso especial de esta respuesta:ssh myserver ./start.sh &>/dev/null &
Alek_A