เหตุใด SSH จึงหยุดทำงานที่ท้ายคำสั่งเหล่านี้และฉันจะทำให้ออกได้อย่างไร


10

ฉันรันสิ่งนี้:

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

หมายเหตุ: ฉันได้ลองและไม่ใช้ -t ใน ssh

เอาต์พุตการดีบักจาก -vvv คือ:

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

จากนั้นกระบวนการก็จะอยู่ที่นั่นตลอดไป เหตุใดคำสั่ง ssh จะไม่สิ้นสุด ฉันได้ลองกับ -t และไม่และฉันได้ลองกับทางออกและไม่ มันไม่ได้สร้างความแตกต่าง :(

อัปเดต: เมื่อฉันพิมพ์ 'jobs' ที่ท้ายสคริปต์ฉันเห็น:

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 &

ฉันจะเรียกใช้บริการเหล่านี้และยังมีเซสชัน ssh ที่สิ้นสุดได้อย่างไร

อัปเดต: ตอนนี้ฉันปฏิเสธกระบวนการเหล่านี้ด้วยตนเอง สิ่งที่ยังไม่ออก เพื่อน WTF?

อัปเดต: เมื่อเรียกใช้งานทีละบรรทัดคำสั่งสองคำสั่งจะไม่กลับไปที่เชลล์โดยไม่ต้องกดปุ่ม CR:

nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
nohup bin/kafka-server-start.sh config/server.properties &

ลองใช้ -q (โหมดเงียบ) แทน -vvv (โหมด verbose)
กันยายน

ไม่มีผลกระทบ. -vvv เป็นเพียงการดีบัก
rjurney

SSH ไปยังเซิร์ฟเวอร์และดำเนินการคำสั่งเหล่านี้ทีละหนึ่งเพื่อคิดออกเหตุผลแขวน
กันยายน

1
นั่นคือสิ่งที่ - ไม่มีพวกเขาแขวน! ทำงานได้ดีในคอนโซล
rjurney

ใช้งานได้หรือไม่หากคุณแทนที่เนื้อหาของบล็อก << EOI ด้วยบางอย่างเช่น "echo 1"
เอ็ด

คำตอบ:


22

โดยทั่วไปเซสชันเทอร์มินัล SSH จะหยุดทำงานหากยังคงมีการเชื่อมต่อพื้นหลังที่ยังคงเปิดอยู่ โดยการเชื่อมต่อพื้นหลังฉันหมายถึงสิ่งต่าง ๆ เช่น:

  • การส่งต่อหน้าต่าง X11
  • STDOUT และ STDERR

ดูการเชื่อมต่อที่ยังคงทำงานอยู่ในเซสชัน SSH ที่หยุดทำงานของคุณโดยพิมพ์~#ในเทอร์มินัล SSH ที่แขวน

อาจเป็นได้ว่าสคริปต์ของคุณกำลังเปิดเซสชันที่คุณไม่ทราบ หรือการกำหนดค่าเทอร์มินัลของเครื่องระยะไกลเช่น.profile(หรือ.bashrcอื่น ๆ ) อาจมีบางอย่างในเครื่องที่สร้างเซสชัน ขอให้โชคดีล่าสัตว์!

โดยวิธีการบางส่วนของลำดับการหลบหนีอื่น ๆ ที่นำเสนอโดยลูกค้า OpenSSH อาจมีประโยชน์:

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

สิ่งหนึ่งที่อื่น ๆ ถ้าคุณต้องการ SSH ของคุณเพียงแค่เรียกใช้คำสั่งของคุณและออกทันที - นั่นคือคุณไม่ต้องการให้เซสชั่นมินัลระยะไกล - คุณสามารถใช้ตัวเลือกในการ-f sshที่จะบังคับให้การเชื่อมต่อ SSH เป็นงานพื้นหลัง


3
การเชื่อมต่อต่อไปนี้เปิดอยู่: # 0 ไคลเอ็นต์ - เซสชัน (t4 r0 i0 / 0 o0 / 0 fd 5/6 cc -1) นี่คือสิ่งที่ฉันได้รับ สิ่งนี้หมายความว่าอะไร?
moleculezz

-fทำงานได้สำหรับฉัน
Jingguo Yao

ฉันได้ยินเรื่อง -n เพื่อจุดประสงค์เดียวกัน แต่นั่นก็ไม่ได้ผลสำหรับฉัน!
Kostas

กระบวนการพื้นหลังนับเป็นbackground connectionและสามารถdisownทำกระบวนการพื้นหลังเพื่อให้การเชื่อมต่อ ssh ไม่หยุดทำงานหรือไม่
the_prole
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.