จะเกิดอะไรขึ้นกับการดำเนินการต่อเนื่องถ้าเราทำ ssh แล้วยกเลิกการเชื่อมต่อ?


10

ฉันกำลังย้ายไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่งโดยใช้คำสั่ง mv

อย่างไรก็ตามฉันถูกบังคับให้ปิดเครื่องคอมพิวเตอร์ซึ่งหมายความว่าการเชื่อมต่อกับเซิร์ฟเวอร์ขาดหายไป

เกิดอะไรขึ้นกับคำสั่ง mv?

หมายเหตุ: หลังจากฉัน relogin ฉันเห็นว่าไฟล์ทั้งหมดถูกย้ายอย่างถูกต้องแม้ว่าฉันแน่ใจว่ามันไม่ได้ถูกย้ายเมื่อฉันปิดการเชื่อมต่อ ดูเหมือนว่า mv จะยังคงทำงานต่อไป

นี่คือฉัน ssh ถึงเครื่อง centosh ในเซิร์ฟเวอร์คลาวด์ steadfast.net


ฉันเดาว่ามันจะโยนข้อผิดพลาดเกี่ยวกับแหล่งที่มา / ปลายทางที่ไม่พร้อมใช้งาน
SHW

1
การย้ายไดเรกทอรีไปยังอีกรายการหนึ่งคือ "ทันที" หากอยู่ในพาร์ติชันเดียวกัน และแม้ว่าคุณจะย้ายไฟล์ต่อไฟล์มันก็สามารถทำได้อย่างรวดเร็ว คุณแน่ใจหรือไม่ว่ามันจะดำเนินการต่อหลังจากที่คุณตัดการเชื่อมต่อ (แทนที่จะจบในขณะที่สัญญาณ SIGHUP ที่แตกต่างกันถูกส่งไปยังกระบวนการลูกซึ่งอาจใช้เวลา [ในระดับคอมพิวเตอร์] เวลา
Olivier Dulac

เป็นวิธีแก้ปัญหาใช้screenหรือเข้าสู่ระบบtmuxครั้งเดียวเพื่อเริ่มต้นเทอร์มินัลเสมือนที่จะทำงานต่อไปเมื่อคุณตัดการเชื่อมต่อ [คือคุณสามารถแนบไฟล์อีกครั้งในภายหลังและดูเทอร์มินัลในสถานะเดียวกับที่คุณทิ้งไว้ ระหว่าง]
Olivier Dulac

คำตอบ:


19

ถ้าmvเริ่มเป็น:

ssh host mv x y

จากนั้นmvจะได้รับ SIGPIPE (และตาย) หากพยายามเขียนสิ่งใดไปยัง stdout หรือ stderr (เช่นข้อความแสดงข้อผิดพลาด)

หากคุณเริ่มเซสชันการโต้ตอบเช่น:

ssh host

และเริ่มต้นmvจากเชลล์แบบโต้ตอบในนั้นเมื่อด้านต้นแบบของสถานีหลอกที่เริ่มต้นโดยsshdจะถูกปิด (เมื่อsshปิดการเชื่อมต่อ TCP เมื่อออก) ผู้นำของเซสชันที่เกี่ยวข้องกับด้านทาสของเทอร์มินัลหลอกที่ เป็นเปลือกโต้ตอบระยะไกลจะได้รับสัญญาณ SIGHUP (วางสาย)

เมื่อได้รับสัญญาณนั้นเชลล์ (ยกเว้นว่าคุณได้ออกกtrap '' HUP) มักจะส่งต่อสัญญาณนั้นไปยังกระบวนการทั้งหมดในงานที่พวกเขาเริ่มต้นเว้นแต่คุณจะบอกอย่างชัดเจนว่าไม่ให้ (เช่นกับdisownหรือ&|ในบางเชลล์)

mvโดยทั่วไปกระบวนการอื่น ๆ (เช่น) จะตายเมื่อได้รับสัญญาณนั้นเว้นแต่พวกเขาได้รับคำสั่งให้เพิกเฉย (โดยใช้nohupหรือหากผู้ปกครองเพิกเฉย)

หากคุณได้ออก:

trap '' HUP

จากนั้นงานทั้งหมดที่เริ่มต้นหลังจากที่มันจะสืบทอดและจะไม่สนใจ SIGHUP

เชลล์จะไม่ตายจากสัญญาณ SIGHUP ที่ส่งมาจากการตัดการเชื่อมต่อ แต่จะออกจากที่พรอมต์ถัดไปเนื่องจาก stdin หายไป เมื่อออกแล้วกระสุนบางตัวส่ง SIGHUP ไปยังงานของพวกเขา ผู้ที่เริ่มต้นหลังจากที่trap '' HUPจะเพิกเฉยมันคนอื่นจะตาย

ในระยะสั้นในกรณีนั้นหากคุณไม่ได้ใช้ความระมัดระวังล่วงหน้าเพื่อไม่ให้เกิดขึ้นคุณmvจะต้องตาย

จะหลีกเลี่ยงได้ในครั้งต่อไปถ้าใช้tcsh, zshหรือbashก่อนที่จะปิดเครื่องให้กดCtrl-Zที่จะระงับการmvป้อนbgเพื่อดำเนินการต่อในพื้นหลังและdisownจะปฏิเสธมัน

หรือคุณอาจจะใช้หรือscreen tmuxใน SIGHUP ผู้ใช้จะแยกออกจากโฮสต์ที่หายไปในตอนนี้ แต่แอปพลิเคชันที่ทำงานในเทอร์มินัลที่จำลองจะทำงานต่อไปโดยไม่ต้องมีหัวและคุณสามารถแนบเซสชันกับเทอร์มินัลอื่นmvได้

หรือใช้nohup mvเพื่อสร้างmvภูมิคุ้มกันให้กับ SIGHUP และให้เอาท์พุทและข้อผิดพลาดของมันไปที่nohup.outไฟล์ที่คุณสามารถตรวจสอบได้ในภายหลัง

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


คุณกำลังบอกว่า mv จะถูกยกเลิก โปรดตรวจสอบบันทึกย่อ
user4951

2
+1 คำตอบที่โดดเด่น (เป็นไปในรายละเอียดเพื่ออธิบายสิ่งที่เกิดขึ้นและเมื่อ)
Olivier Dulac

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