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.

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


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.


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.