Warum bleibt SSH am Ende dieser Befehle hängen und wie kann ich es beenden?

10

Ich führe das aus:

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

Hinweis: Ich habe es mit und ohne -t in ssh versucht.

Die Debug-Ausgabe von -vvv lautet wie folgt:

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

Und dann sitzt der Prozess einfach für immer da. Warum endet der Befehl ssh nicht? Ich habe es mit -t und ohne versucht, und ich habe es mit dem Ausgang und ohne versucht. Es macht keinen Unterschied :(

Update: Wenn ich am Ende des Skripts 'jobs' eingebe, wird Folgendes angezeigt:

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 &

Wie kann ich diese Dienste ausführen und trotzdem eine SSH-Sitzung beenden?

Update: Ich habe diese Prozesse jetzt manuell abgelehnt. Das Ding geht immer noch nicht aus. WTF Kumpel?

Update: Bei der zeilenweisen Ausführung kehren zwei Befehle nicht zur Shell zurück, ohne CR zu treffen:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
rjurney
quelle
Versuchen Sie, -q (leiser Modus) anstelle von -vvv (ausführlicher Modus) zu verwenden.
September
keine Wirkung. -vvv war nur zum Debuggen.
rjurney
SSH an den Server und führen Sie alle diese Befehle nacheinander aus, um den Grund für den Hang herauszufinden.
September
1
Das ist die Sache - keiner von ihnen hängt! Dies funktioniert gut in der Konsole.
rjurney
Funktioniert es, wenn Sie den Inhalt des << EOI-Blocks durch etwas wie "Echo 1" ersetzen?
ed.

Antworten:

22

In der Regel hängen SSH-Terminalsitzungen ab, wenn noch Hintergrundverbindungen geöffnet sind. Mit Hintergrundverbindungen meine ich Dinge wie:

  • X11-Fensterweiterleitung
  • STDOUT und STDERR

Sehen Sie sich die Verbindungen an, die in Ihrer SSH-Sitzung noch aktiv sind, indem Sie ~#Ihr SSH-Terminal eingeben .

Es kann sein, dass Ihr Skript Sitzungen öffnet, die Sie nicht erkannt haben. Oder die Terminal-Konfigurationen Ihres Remote-Computers wie .profile(oder .bashrcusw.) enthalten möglicherweise etwas, das eine Sitzung einrichtet. Viel Glück bei der Jagd!

Übrigens können auch einige der anderen Escape-Sequenzen, die von OpenSSH-Clients angeboten werden, nützlich sein:

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

Eine andere Sache, wenn Sie möchten, dass Ihr SSH nur Ihre Befehle ausführt und sofort beendet - das heißt, Sie möchten keine Remote-Terminalsitzung -, können Sie die -fOption verwenden ssh. Dadurch wird die SSH-Verbindung zu einem Hintergrundjob.

Padub
quelle
3
Die folgenden Verbindungen sind offen: # 0 Client-Sitzung (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) Das bekomme ich. Bedeutet das etwas?
Molecularzz
-ffunktioniert bei mir.
Jingguo Yao
Ich habe aus dem gleichen Grund von -n gehört, aber das hat bei mir nicht funktioniert!
Kostas
Zählt ein Hintergrundprozess als background connectionund kann man disownden Hintergrundprozess ausführen, damit die SSH-Verbindung nicht hängt?
the_prole