¿Por qué SSH se cuelga al final de estos comandos y cómo puedo hacer que salga?

10

Yo corro esto:

ssh -t -vvv -i ~/.ssh/druid-keypair -o StrictHostKeyChecking=no ubuntu@${INSTANCE_ADDRESS} <<EOI

# Setup Oracle Java
...

# Install dependencies - mysql must be built from source, as the 12.04 apt-get hangs
export DEBIAN_FRONTEND=noninteractive
sudo debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password password diurd'
sudo debconf-set-selections <<< 'mysql-server-5.5 mysql-server/root_password_again password diurd'
sudo apt-get -q -y -V --force-yes --reinstall install mysql-server-5.5

echo "ALL DONE with druid environment setup!"
exit
EOI

Nota: He intentado con y sin -t en ssh.

La salida de depuración de -vvv es esta:

...
ldconfig deferred processing now taking place
ALL DONE with druid environment setup!
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0

Y luego el proceso se queda allí para siempre. ¿Por qué no termina el comando ssh? He intentado con -t y sin, y he intentado con la salida y sin. No hace la diferencia :(

Actualización: cuando escribo 'jobs' al final del script, veo:

JOBS:
[1]-  Running                 nohup bin/zookeeper-server-start.sh config/zookeeper.properties 2>&1 > /dev/null &
[2]+  Running                 nohup bin/kafka-server-start.sh config/server.properties 2>&1 > /dev/null &

¿Cómo puedo ejecutar estos servicios y aún tener una sesión ssh que finaliza?

Actualización: ahora desconozco manualmente estos procesos. La cosa aún no sale. WTF compañero?

Actualización: Al ejecutar línea por línea, dos comandos no regresan al shell sin presionar CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
rjurney
fuente
Intente usar -q (modo silencioso) en lugar de -vvv (modo detallado).
septiembre
sin efecto. -vvv fue solo para depurar.
rjurney
SSH al servidor y ejecute todos estos comandos uno por uno para descubrir la razón de la caída.
septiembre
1
Esa es la cosa, ¡ninguno de ellos cuelga! Esto funciona bien en la consola.
rjurney
¿Funciona si reemplaza el contenido del bloque << EOI con algo como "echo 1"?
ed.

Respuestas:

22

Por lo general, las sesiones de terminal SSH se bloquean si todavía hay conexiones en segundo plano abiertas. Por conexiones de fondo, me refiero a cosas como:

  • Reenvío de ventana X11
  • STDOUT y STDERR

Eche un vistazo a las conexiones que aún están activas en su sesión SSH colgada escribiendo ~#su terminal SSH colgado.

Podría ser que su guión esté abriendo sesiones de las que no se dio cuenta. O las configuraciones de terminal de su máquina remota como .profile(o .bashrc, etc.) pueden tener algo que establezca una sesión. Buena suerte cazando!

Por cierto, algunas de las otras secuencias de escape que ofrecen los clientes OpenSSH también pueden ser útiles:

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Otra cosa, si desea que su SSH solo ejecute sus comandos y salga inmediatamente, es decir, no desea una sesión de terminal remota, puede usar la -fopción para ssh. Eso obligará a la conexión SSH a ser un trabajo en segundo plano.

padub
fuente
3
Las siguientes conexiones están abiertas: # 0 cliente-sesión (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) Esto es lo que obtengo. ¿Esto significa algo?
moléculazz
-ffunciona para mi.
Jingguo Yao
¡Escuché de -n con el mismo propósito, pero eso no funcionó para mí!
Kostas
¿Un proceso en segundo plano cuenta como background connectiony puede uno disownel proceso en segundo plano para que la conexión ssh no se bloquee?
the_prole