วิธีกู้คืนเชลล์หลังจากขาดการเชื่อมต่อ


36

กำลังทำงานบางอย่างกับเครื่อง CentOS 5.6 ระยะไกลและเครือข่ายของฉันลดลงเรื่อย ๆ มีวิธีที่ฉันสามารถกู้คืนเซสชันที่หยุดทำงานหลังจากเชื่อมต่อใหม่ได้หรือไม่

แก้ไข: ฉันกำลังทำการปรับปรุงและติดตั้งด้วย yum และฉันกังวลว่านี่อาจเป็นปัญหาหากกระบวนการยังคงค้างอยู่ตรงกลางของสิ่งที่พวกเขากำลังทำอยู่


6
tmux หรือหน้าจอ
sehe

คำตอบ:


63

ไม่มีทาง tmuxแต่เพื่อป้องกันไม่ให้ผมนี้เช่นการใช้ ฉันเริ่ม tmux เริ่มการดำเนินการและไปตามทางของฉัน tmux attachถ้าผมกลับมาและพบการเชื่อมต่อที่ได้รับการเสียทั้งหมดที่ฉันต้องทำคือการเชื่อมต่อและประเภท

นี่คือตัวอย่าง

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

ไม่ต้อง tmux และกำลังได้รับอนุญาตให้ติดตั้งสิ่งที่ไม่ได้อยู่ในการทำรายการของฉัน ...

5
@sergio หัวใจของฉันเลือดออก :-)) screenการใช้

4
@sergio บนระบบ Unix แอพพลิเคชั่นใด ๆ ที่ไม่ต้องการการอนุญาตให้รูททำงานอาจติดตั้งในโฮมไดเร็กตอรี่แรกได้.
Kusalananda

35

คำแนะนำสำหรับ tmux และหน้าจอเป็นคำแนะนำที่ดี พวกเขาบ่งบอกถึงคำตอบสำหรับคำถามของคุณ แต่ไม่ได้ระบุ คำตอบสำหรับคำถามคือไม่มีทาง หากคุณเข้าสู่ระบบผ่าน ssh เชลล์จะสิ้นสุดลงเมื่อการเชื่อมต่อลดลง การหลีกเลี่ยงปัญหาคือการเข้าสู่ระบบและเริ่มต้นเทอร์มินัลเสมือนบางชนิด (เช่นtmux) เมื่อการเชื่อมต่อลดลงเชลล์ที่คุณใช้อยู่นั้นจะสิ้นสุดลง แต่คุณสามารถเปิดเชลล์ใหม่และเชื่อมต่อกับเทอร์มินัลเสมือนอีกครั้ง (นั่นคือกำลังรันเชลล์ที่คุณทำงานอยู่จริง ๆ )


ตกลง. ชัดเจนตอนนี้

สมมติว่ากระบวนการ yumยังคงทำงานอยู่ (ไม่ได้ยุติทันทีเมื่อเชลล์ได้รับ SIGHUP) reptyrหรือที่คล้ายกันอาจเพียงพอที่จะกู้คืนกระบวนการหรือ - ยืนยันว่า - รับเอาท์พุทใด ๆ ในอนาคต โดยทั่วไปแล้วเชลล์จะถูกยกเลิกเมื่อตัดการเชื่อมต่อ
Eroen

@Eroen คุณหมายถึงแม้เมื่อใช้ tmux ระบบปฏิบัติการจะยุติกระบวนการ tmux เมื่อพบว่าการเชื่อมต่อขาดหาย
Dojo

@Dojo เมื่อการเชื่อมต่อถูกยกเลิกอินสแตนซ์ tmux จะหยุดทำงาน แต่เซสชัน tmux (และเชลล์ที่จัดการ) จะยังคงอยู่
William Pursell

หากผู้ใช้ขาดการเชื่อมต่อกับเซิร์ฟเวอร์ ssh ระยะไกลเพราะตัวอย่างเช่นเขาก็ถอดสายเคเบิล RJ-45 โดยไม่ได้ตั้งใจผมคิดว่าเซิร์ฟเวอร์ ssh ยังคงเก็บเซสชันนี้ไว้จนกว่าจะหมดเวลาที่กำหนดไว้ล่วงหน้า (เช่น 120 วินาที) ดังนั้นในกรณีนี้มีวิธีที่จะดำเนินการต่อเซสชันนี้ที่ยังคงอยู่บนฝั่งเซิร์ฟเวอร์ ssh ภายใน 120 วินาทีหลังจากถอดสายเคเบิลหรือไม่?
Gab 是好人

8

อย่างที่ William พูดคำตอบสั้น ๆ คือไม่มีทางเลย เพื่อป้องกันสิ่งนี้คุณสามารถใช้คำสั่งหน้าจอก่อนที่คุณจะขาดการเชื่อมต่อ


จากสิ่งที่ฉันเข้าใจฉันจะต้องเริ่มต้นยำกับหน้าจอ ... ดีฉันไม่ได้ ฉันไม่สามารถเรียกใช้ซ้ำอีกมันบอกว่ามันยังคงมีการใช้งานอยู่และฉันไม่ต้องการบังคับให้ฆ่ามัน .. ฉันจะควบคุมการทำงานของยำ

และ byobu เป็นส่วนเสริมที่ดีของหน้าจอเพื่อให้เปิดตัวโดยอัตโนมัติในเทอร์มินัลกราฟิกที่ดีlaunchpad.net/byobu

เท่าที่ฉันรู้ว่าคุณทำไม่ได้นอกจากจะมีวิธีซ่อนเร้นที่จะเปลี่ยนเส้นทางเอาต์พุตจากคำสั่ง yum ไปยังเซสชันคำศัพท์ปัจจุบันของคุณ แต่ฉันไม่สามารถนึกถึงสิ่งใดสิ่งหนึ่งที่อยู่ด้านบนหัวของฉัน
นิโคลัสสมิ ธ

มีวิธีแก้ไขบางส่วนจำนวนหนึ่งที่ใช้ตัวแก้จุดบกพร่อง & c เพื่อให้กระบวนการเปลือกหลักใหม่ Reptyrเป็นหนึ่งและบล็อกโพสต์อธิบายถึงปัญหาการแก้ปัญหาและการใช้งานอื่น ๆ
Eroen

3

ไม่คุณไม่สามารถกู้คืนเชลล์หลังจากขาดการเชื่อมต่อ สิ่งที่คุณสามารถทำได้คือให้แน่ใจว่าคำสั่งที่คุณรันนั้นยังคงทำงานหลังจากยกเลิกการเชื่อมต่อ

เพื่อให้บรรลุเป้าหมายนี้ให้ใช้คำสั่ง "nohup" และ "disown" ซึ่งโดยปกติแล้วจะเป็นคำสั่ง builtin บนเชลล์ส่วนใหญ่เช่นคุณไม่จำเป็นต้องติดตั้งอะไรเลย สิ่งนี้ใช้ได้กับคำสั่งที่ไม่ใช่แบบโต้ตอบเท่านั้น

ดังนั้นขั้นตอนจะเป็นดังนี้:

  1. เข้าสู่ระบบเซิร์ฟเวอร์
  2. เรียกใช้คำสั่งของคุณ: "nohup sudo yum update &" (สิ่งนี้จะบันทึกผลลัพธ์ทั้งหมดไปยังไฟล์ nohup.out ในไดเรกทอรีปัจจุบันของคุณ)
  3. เรียกใช้ "ปฏิเสธ% 1"
  4. รู้สึกอิสระที่จะตัดการเชื่อมต่อ ณ จุดนี้หรือรอที่จะตัดการเชื่อมต่อ :)

เมื่อคุณกลับมาที่เซิร์ฟเวอร์เพียง "tail nohup.out" เพื่อดูว่าคำสั่งทำงานอย่างไร


กรณีนี้ใช้ไม่ได้ผลไม่ดีนักในกรณีทั่วไปใช่ไหม ตัวอย่างเช่นด้วยคำสั่งที่ต้องการอินพุตในครั้งเดียวหรืออื่น ... สำหรับคำสั่งที่ไม่มีการโต้ตอบอย่างสมบูรณ์มันอาจทำงานได้ดีพอและหลีกเลี่ยงค่าใช้จ่ายของ (และอาจจำเป็นต้องติดตั้ง) multiplexer เทอร์มินัล
CVn

ใช่ใช้งานได้เฉพาะถ้าคำสั่งของคุณไม่ต้องการให้ผู้ใช้ป้อนข้อมูลฉันได้อัปเดตคำตอบแล้ว โดยรวมแล้วเทอร์มินัลมัลติเพล็กเซอร์เป็นหนทางที่แน่นอน แต่ก็มีการกล่าวถึงว่าไม่มีเครื่องมือเพิ่มเติมใด ๆ ที่ได้รับอนุญาตให้ติดตั้ง
zygis

แน่นอนมันเป็นคำตอบที่ถูกต้อง จำกัด เพียงเล็กน้อยในกรณีการใช้งานที่เป็นไปได้ โหวตขึ้นพร้อมกับการแก้ไข
CVn

3

มีคนเพิ่ม reptyr ในความคิดเห็นมากกว่าคำตอบดังนั้นฉันจึงไม่สามารถ upvote ได้ แต่ดูเหมือนว่าเป็นคำตอบที่ดีสำหรับคำถามที่แก้ไขแล้วและทำงานได้ดีบน CentOS

โปรดดู: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

มีวิธีที่ฉันสามารถกู้คืนเซสชันที่หยุดทำงานหลังจากเชื่อมต่อใหม่ได้หรือไม่

แก้ไข: ฉันกำลังทำการปรับปรุงและติดตั้งด้วย yum และฉันกังวลว่านี่อาจเป็นปัญหาหากกระบวนการยังคงค้างอยู่ตรงกลางของสิ่งที่พวกเขากำลังทำอยู่

สิ่งเดียวกันฉันสูญเสียการเชื่อมต่อระยะไกลกับเซสชันการปรับปรุง yum ดังนั้นฉันค้นหาและพบคำถามนี้ ... จากนั้นเชื่อมต่อและใช้หน้าจออีกครั้ง:

  1. เชื่อมต่อ ssh อีกครั้ง
  2. จอภาพ
  3. ติดตั้ง reptyr ตามลิงค์ด้านบน
  4. ps -a | ยำ
  5. reptyr psid

และฉันอยู่ที่พรอมต์ที่กู้คืนซึ่ง yum ให้เวลาหลายชั่วโมงก่อนหน้านี้

ในทางเทคนิคแล้วคำตอบนั้นถูกต้องทั้งหมดนี่ไม่ใช่การกู้คืนของเซสชันที่หยุดทำงาน แต่เป็นการซ่อมแซมกระบวนการกำพร้าให้กับเซสชันปัจจุบัน และมีประโยชน์มากมันเกินไป ...


1

ตามที่หลายคนแนะนำscreenและtmuxพวกเขาทั้งสองสนับสนุนฟังก์ชั่นพื้นฐาน แต่มีคุณสมบัติเฉพาะที่แตกต่างกันดังนั้นจึงไม่สามารถพูดได้ว่าสิ่งหนึ่งเหนือกว่าอีกคุณสมบัติหนึ่งในทุกกรณี ตัวอย่างเช่นมีเพียง tmux เท่านั้นที่รองรับการแบ่งหน้าต่างในขณะที่หน้าจอ GNU เท่านั้นที่สามารถสลับการตัดบรรทัดยาวด้วย (Ctrl + ar) ดูการเปรียบเทียบรายละเอียดเพิ่มเติมที่นี่

มีเครื่องมือที่มีอยู่โดยเฉพาะเพื่อแก้ไขปัญหาของ ssh นี้:

Autosshเป็นโปรแกรมที่จะเริ่มสำเนาของ ssh และตรวจสอบมันเริ่มต้นใหม่ตามความจำเป็นหากมันตายหรือหยุดผ่านการจราจร ความคิดมาจาก rstunnel

Moshเป็นแอปพลิเคชั่นเทอร์มินัลระยะไกลที่อนุญาตให้โรมมิ่งรองรับการเชื่อมต่อเป็นระยะและให้เสียงสะท้อนในท้องถิ่นและการแก้ไขการกดแป้นของผู้ใช้ Mosh แทน SSH มันแข็งแกร่งและตอบสนองได้ดียิ่งขึ้นโดยเฉพาะผ่าน Wi-Fi, เซลลูล่าร์และลิงค์ทางไกล


-1

สิ่งนี้สามารถทำได้โดยใช้tmuxเชลล์ หากคุณตัดการเชื่อมต่อวิธีที่เร็วที่สุดในการติดตั้งซ้ำเซสชัน:

tmux a #0

นี่เป็นการเพิ่มอะไรที่คำตอบที่ยอมรับไม่ได้พูด นอกจากนี้ยังอนุมานว่าผู้ใช้ได้เปิดใช้งานtmuxเซสชันแล้ว
Kusalananda

2
นี่อาจเป็นความคิดเห็นเกี่ยวกับคำตอบที่บอกว่า "คุณสามารถย่อได้attachว่าa"
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.