Mengapa SSH menggantung di akhir perintah ini dan bagaimana saya bisa membuatnya keluar?

10

Saya menjalankan ini:

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

Catatan: Saya sudah mencoba dengan dan tanpa -t di ssh.

Output debug dari -vvv adalah ini:

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

Dan kemudian proses itu hanya duduk di sana selamanya. Mengapa perintah ssh tidak akan berakhir? Saya telah mencoba dengan -t dan tanpa, dan saya telah mencoba dengan pintu keluar dan tanpa. Itu tidak membuat perbedaan :(

Pembaruan: Ketika saya mengetik 'pekerjaan' di akhir skrip, saya melihat:

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 &

Bagaimana saya bisa menjalankan layanan ini dan masih memiliki sesi ssh yang berakhir?

Pembaruan: Saya sekarang secara manual menolak proses ini. Masalahnya masih belum keluar. Pasangan WTF?

Pembaruan: Saat menjalankan baris demi baris, dua perintah tidak kembali ke shell tanpa menekan CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &
rjurney
sumber
Cobalah untuk menggunakan -q (mode diam) alih-alih -vvv (mode verbose).
september
tidak berpengaruh. -vvv hanya untuk debug.
rjurney
SSH ke server dan jalankan semua perintah ini satu per satu untuk mengetahui alasan hang.
september
1
Itu masalahnya - tidak ada yang menggantung! Ini berfungsi dengan baik di konsol.
rjurney
Apakah itu berfungsi jika Anda mengganti konten blok << EOI dengan sesuatu seperti "echo 1"?
ed.

Jawaban:

22

Biasanya, sesi terminal SSH menggantung jika masih ada koneksi latar belakang yang masih terbuka. Dengan koneksi latar belakang, maksud saya hal-hal seperti:

  • Penerusan jendela X11
  • STDOUT dan STDERR

Lihatlah koneksi yang masih aktif di sesi SSH Anda yang digantung dengan mengetik ~#di terminal SSH Anda.

Bisa jadi skrip Anda membuka sesi yang tidak Anda sadari. Atau konfigurasi terminal mesin jarak jauh Anda seperti .profile(atau .bashrc, dll.) Mungkin memiliki sesuatu di dalamnya yang membentuk sesi. Semoga beruntung berburu!

Ngomong-ngomong, beberapa urutan pelarian lain yang ditawarkan oleh klien OpenSSH mungkin juga berguna:

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

Satu hal lagi, jika Anda ingin SSH menjalankan perintah Anda dan segera keluar - yaitu, Anda tidak ingin sesi terminal jarak jauh - Anda dapat menggunakan -fopsi ini ssh. Itu akan memaksa koneksi SSH menjadi pekerjaan latar belakang.

padub
sumber
3
Koneksi berikut terbuka: # 0 sesi klien (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) Inilah yang saya dapatkan. Apakah ini ada artinya?
moleculezz
-fbekerja untukku.
Jingguo Yao
Saya mendengar -n untuk tujuan yang sama tetapi itu tidak berhasil untuk saya!
Kostas
Apakah proses latar belakang dihitung sebagai background connectiondan dapatkah disownproses latar belakang sehingga koneksi ssh tidak hang?
the_prole