Dlaczego SSH zawiesza się na końcu tych poleceń i jak mogę je zakończyć?

10

Uruchomię to:

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

Uwaga: Próbowałem z i bez -t w ssh.

Dane wyjściowe debugowania z -vvv są następujące:

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

A potem cały proces trwa wiecznie. Dlaczego polecenie ssh się nie kończy? Próbowałem z -t i bez, i próbowałem z wyjściem i bez. To nie robi różnicy :(

Aktualizacja: Kiedy piszę „zadania” na końcu skryptu, widzę:

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 &

Jak mogę uruchomić te usługi i nadal mieć sesję ssh, która się kończy?

Aktualizacja: teraz ręcznie odrzucam te procesy. Ta rzecz nadal nie wychodzi. Kumpel WTF?

Aktualizacja: Podczas wykonywania linia po linii dwa polecenia nie wracają do powłoki bez naciśnięcia CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
rjurney
źródło
Spróbuj użyć -q (tryb cichy) zamiast -vvv (tryb gadatliwy).
września
bez efektu. -vvv miał po prostu debugować.
rjurney
SSH do serwera i wykonaj wszystkie te polecenia jeden po drugim, aby ustalić powód zawieszenia.
wrzesień
1
O to chodzi - żadne z nich nie zawiesza się! Działa to dobrze w konsoli.
rjurney
Czy to działa, jeśli zastąpisz zawartość bloku << EOI czymś takim jak „echo 1”?
wyd.

Odpowiedzi:

22

Zazwyczaj sesje terminalu SSH zawieszają się, jeśli nadal są otwarte połączenia w tle. Przez połączenia w tle rozumiem takie rzeczy jak:

  • Przekierowywanie okna X11
  • STDOUT i STDERR

Spójrz na połączenia, które są nadal aktywne podczas zawieszonej sesji SSH, wpisując ~#zawieszony terminal SSH.

Możliwe, że skrypt otwiera sesje, których nie zdawałeś sobie sprawy. Lub konfiguracje terminala komputera zdalnego, takie jak .profile(lub .bashrcitp.), Mogą zawierać coś, co ustanawia sesję. Powodzenia w polowaniu!

Nawiasem mówiąc, niektóre inne sekwencje specjalne oferowane przez klientów OpenSSH mogą być również przydatne:

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

Inną rzeczą jest to, że jeśli chcesz, aby Twój SSH po prostu uruchamiał twoje polecenia i natychmiast kończył działanie - to znaczy nie chcesz zdalnej sesji terminala - możesz użyć tej -fopcji ssh. To zmusi połączenie SSH do pracy w tle.

padub
źródło
3
Otwarte są następujące połączenia: # 0 sesja klienta (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) To właśnie otrzymuję. Czy to coś znaczy?
cząsteczkowy
-fpracuje dla mnie.
Jingguo Yao,
Słyszałem o -n w tym samym celu, ale to nie działało dla mnie!
Kostas,
Czy proces w tle jest liczony jako i background connectionczy można disowngo przetwarzać w tle, aby połączenie ssh się nie zawiesiło?
the_prole