Pourquoi SSH se bloque-t-il à la fin de ces commandes et comment puis-je le faire quitter?

10

Je lance ceci:

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

Remarque: j'ai essayé avec et sans -t dans ssh.

La sortie de débogage de -vvv est la suivante:

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

Et puis le processus reste là pour toujours. Pourquoi la commande ssh ne se termine-t-elle pas? J'ai essayé avec -t et sans, et j'ai essayé avec la sortie et sans. Cela ne fait aucune différence :(

Mise à jour: lorsque je tape «jobs» à la fin du script, je vois:

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 &

Comment puis-je exécuter ces services tout en ayant une session ssh qui se termine?

Mise à jour: je renie maintenant manuellement ces processus. La chose ne sort toujours pas. Compagnon WTF?

Mise à jour: lors de l'exécution ligne par ligne, deux commandes ne reviennent pas au shell sans appuyer sur CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
rjurney
la source
Essayez d'utiliser -q (mode silencieux) au lieu de -vvv (mode verbeux).
septembre
aucun effet. -vvv était juste pour déboguer.
rjurney
SSH au serveur et exécutez toutes ces commandes une par une pour comprendre la raison du blocage.
septembre
1
C'est la chose - aucun d'eux ne pend! Cela fonctionne bien dans la console.
rjurney
Cela fonctionne-t-il si vous remplacez le contenu du bloc << EOI par quelque chose comme "echo 1"?
éd.

Réponses:

22

En règle générale, les sessions de terminal SSH se bloquent s'il reste des connexions d'arrière-plan encore ouvertes. Par connexions d'arrière-plan, j'entends des choses telles que:

  • Transfert de fenêtre X11
  • STDOUT et STDERR

Jetez un œil aux connexions qui sont toujours actives sur votre session SSH bloquée en tapant ~#votre terminal SSH suspendu.

Il se peut que votre script ouvre des sessions que vous ne réalisiez pas. Ou les configurations de terminal de votre machine distante comme .profile(ou .bashrc, etc.) peuvent contenir quelque chose qui établit une session. Bonne chance à la chasse!

Soit dit en passant, certaines des autres séquences d'échappement proposées par les clients OpenSSH peuvent également être utiles:

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.)

Une autre chose, si vous voulez que votre SSH exécute simplement vos commandes et quitte immédiatement - c'est-à-dire que vous ne voulez pas de session de terminal distant - vous pouvez utiliser l' -foption pour ssh. Cela forcera la connexion SSH à être un travail d'arrière-plan.

padub
la source
3
Les connexions suivantes sont ouvertes: # 0 client-session (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) C'est ce que j'obtiens. Est-ce que cela signifie quelque chose?
moleculezz
-ftravaille pour moi.
Jingguo Yao
J'ai entendu parler de -n dans le même but, mais cela n'a pas fonctionné pour moi!
Kostas
Un processus d'arrière-plan compte-t-il comme un background connectionet peut-il être disownle processus d'arrière-plan afin que la connexion ssh ne se bloque pas?
the_prole