example - Terminar sesión SSH ejecutada por script bash
bash traduccion (4)
Tengo un script que puedo ejecutar localmente para iniciar un servidor de forma remota:
#!/bin/bash
ssh [email protected] <<EOF
nohup /path/to/run.sh &
EOF
echo ''done''
Después de ejecutar nohup, se cuelga. Tengo que presionar ctrl-c para salir del script.
He intentado agregar una salida explícita al final del documento aquí y usar el argumento "-t" para ssh. Ninguno de los dos funciona ¿Cómo hago que este script salga inmediatamente?
EDITAR: El cliente es OSX 10.6, el servidor es Ubuntu.
Creo que el problema es que nohup no puede redirigir la salida cuando vienes de ssh, solo redirige a nohup.out cuando cree que está conectada a un terminal, y la anulación estándar que tienes evitará eso, incluso con -t
.
Una solución alternativa podría ser redirigir la salida usted mismo, entonces el cliente ssh puede desconectarse, no está esperando a que se cierre la transmisión. Algo como:
nohup /path/to/run.sh > run.log &
(Esto me funcionó en una prueba simple conectándome a un servidor Ubuntu desde un cliente OS X).
El problema podría ser que ...
... ssh is respecting the POSIX standard when not closing the session
if a process is still attached to the tty.
Por lo tanto, una solución podría ser separar el stdin
del comando nohup
del tty:
nohup /path/to/run.sh </dev/null &
Ver: SSH se cuelga en la salida al usar nohup
Otro enfoque más podría ser usar ssh -t -t
para forzar la asignación pseudo-tty incluso si stdin
no es un terminal.
man ssh | less -Ip ''multiple -t''
ssh -t -t [email protected] <<EOF
nohup /path/to/run.sh &
EOF
Ver: subshell BASH spawn para SSH y continuar con el flujo del programa
La redirección de la entrada estándar del host remoto desde un documento aquí mientras se invoca a ssh
sin un comando explícito lleva al mensaje: el Pseudo-terminal will not be allocated because stdin is not a terminal.
Para evitar este mensaje, utilice el conmutador -T
ssh
para indicar al host remoto que no es necesario asignar un pseudo-terminal o especificar explícitamente un comando (como /bin/sh
) para que el host remoto ejecute los comandos proporcionados por El documento aquí.
Si se le da un comando explícito a ssh
, el valor predeterminado es no proporcionar un shell de inicio de sesión en forma de pseudo-terminal, es decir, no habrá sesión de inicio de sesión normal cuando se especifique un comando (consulte man ssh
).
Sin un comando especificado para ssh
, por otro lado, el valor predeterminado es crear un pseudo-tty para una sesión de inicio de sesión interactiva en el host remoto.
- ssh [email protected] <<EOF
+ ssh -T [email protected] <<EOF
+ ssh [email protected] /bin/bash <<EOF
Como regla general, ssh -t
o incluso ssh -t -t
solo deben usarse si hay comandos que esperan que stdin / stdout sea un terminal (como top
o vim
) o si es necesario eliminar el shell remoto y su hijos cuando el comando ssh
client finaliza la ejecución (ver: el comando ssh continúa inesperadamente en otro sistema después de que ssh termina ).
Por lo que puedo decir, la única manera de combinar un comando ssh
que no asigna un pseudo-tty y un nohup
que escriba en nohup.out
en el host remoto es dejar que el comando nohup
ejecute en un pseudo-terminal no creado por el mecanismo ssh
. Esto se puede hacer con el comando de script
, por ejemplo, y evitará el tcgetattr: Inappropriate ioctl for device
.
#!/bin/bash
ssh localhost /bin/sh <<EOF
#0<&- script -q /dev/null nohup sleep 10 1>&- &
#0<&- script -q -c "nohup sh -c ''date; sleep 10 1>&- &''" /dev/null # Linux
0<&- script -q /dev/null nohup sh -c ''date; sleep 10 1>&- &'' # FreeBSD, Mac OS X
cat nohup.out
exit 0
EOF
echo ''done''
exit 0
Necesitas agregar una exit 0
al final.