ตัวอย่างการใช้คำสั่ง suspend ใน Bash คืออะไร?


12

suspendเป็นคำสั่ง builtin ใน Bash เมื่อใดที่คุณจะใช้คำสั่งนี้โดยธรรมชาติและพบว่ามีประโยชน์หรือไม่


1
เชลล์หยุดตัวเองทุกครั้งที่เรียกใช้กระบวนการลูกคือเรียกใช้คำสั่งที่คำสั่งที่กล่าวว่าเป็นโปรแกรมภายนอกซึ่งต้องการการfork/execเรียกใช้ระบบ
the_velour_fog

1
ในเชลล์แบบโต้ตอบสิ่งนี้อนุญาตให้กระบวนการลูกได้รับการควบคุมของเทอร์มินัลในขณะที่ไม่มีเชลล์พาเรนต์โต้ตอบกับเทอร์มินัลซึ่งทำให้เกิดความยุ่งเหยิง
the_velour_fog

2
@velour แต่นั่นไม่ต้องการการเรียกใช้คำสั่งแยกต่างหากเพื่อให้เกิดผลนั้น?
ilkkachu

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

1
@ Kusalananda ตกลงwait()เสียงที่เหมาะสมกับฉัน ผมบอกว่าระงับเปลือกตัวเองทุกครั้งที่มันส้อมกระบวนการเด็ก ฉันไม่ได้พูดอะไรเกี่ยวกับการรับสัญญาณหยุดใด ๆ ที่จะไม่มีเหตุผล
the_velour_fog

คำตอบ:


14

สมมติว่าคุณขาดทั้ง GNU screenและtmux(และ X11 และคอนโซลเสมือน) แต่ต้องการสลับระหว่างล็อกอินเชลล์และเชลล์โต้ตอบอีกอันหนึ่ง

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

ในความเป็นจริงที่มีการควบคุมงานเปลือกเข้าสู่ระบบอาจวางไข่จำนวนของเปลือกหอยโต้ตอบเป็นงานพื้นหลังที่คุณสามารถสลับไปกับfg %1, fg %2ฯลฯ แต่ที่จะได้รับกลับไปยังเปลือกเข้าสู่ระบบคุณจะต้องใช้เว้นแต่คุณต้องการด้วยตนเองsuspendkill -s STOP $$

นอกจากนี้โปรดทราบว่าCtrl+ Zที่การแจ้งเตือนในเชลล์แบบโต้ตอบจะไม่ระงับ

แก้ไข:เริ่มแรกฉันมีส่วนสมมุติยาว ๆ เกี่ยวกับการใช้suspendสคริปต์ แต่เนื่องจากคำสั่งต้องการการควบคุมงานและเนื่องจากเชลล์ที่ไม่มีการโต้ตอบมักจะไม่มีการควบคุมงานฉันจึงลบหัวข้อนั้นออก


ส่วนที่ถูกลบด้วยการsuspendแทนที่ด้วยkill -s STOP $$(อันนี้ไม่ได้เป็นของคำตอบอีกต่อไป แต่มันอาจจะน่าสนใจสำหรับคนอื่น ๆ อยู่แล้ว):

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

สคริปต์เด็กจะระงับ ( kill -s STOP $$) และสคริปต์ที่ผู้ปกครองจะส่งCONTสัญญาณไปมันเมื่อมันก็โอเคที่จะดำเนินการ

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

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