Shell SIGKILL การทำพวงกุญแจ


18

ฉันจะตั้งค่าการผูกกุญแจเพื่อส่งSIGKILLงานเบื้องหน้าปัจจุบันได้อย่างไร ผมรู้อยู่แล้วว่าCtrl+ Cเป็นSIGINTและCtrl+ คือ\ SIGQUITฉันต้องการตัวเลือกที่รุนแรงกว่านี้

มีอะไรที่ไม่สามารถจัดการได้อย่างจริงจังเกี่ยวกับเรื่องนี้?


มันถูกส่งโดยไดรเวอร์เทอร์มินัลไม่ใช่โดยเชลล์ (ซึ่งไม่รู้ทั้งหมดว่าคุณกำลังทำอะไรกับโปรแกรม)
user1686

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

คำตอบ:


26

ไม่น่าเชื่อหรือไม่จริงมันเป็นไปไม่ได้:

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

คุณสามารถรับรายการชุดคีย์ Ctrl + [?] ที่กำหนดในปัจจุบันจากstty -a; อย่างไรก็ตามมีเพียงintr(SIGINT ซึ่งโดยปกติจะถูกผูกไว้กับ Ctrl + C) quit(SIGQUIT โดยปกติจะถูกผูกไว้กับ Ctrl + \) และsusp(SIGSUSP ซึ่งมักจะถูกผูกไว้กับ Ctrl + Z) สอดคล้องกับสัญญาณยูนิกซ์จริง ( kill,ตัวอย่างเช่นไม่ส่ง SIGKILL แต่ลบอินพุตปัจจุบัน)

น่าเสียดายที่ไม่มีวิธีการส่งสัญญาณหนึ่งในสองสัญญาณที่ไม่สามารถปิดการใช้งานโดยกระบวนการ (SIGKILL และ SIGSTOP) ดังนั้นหากสัญญาณที่กล่าวถึงทั้งสามไม่มีผลคุณจะต้องใช้วิธีอื่น ( เช่นเปลือกอื่น) เพื่อฆ่ากระบวนการเบื้องหน้า

(ที่จริงนอกเหนือจากการจับสัญญาณทั้งสามแล้วกระบวนการเบื้องหน้ายังสามารถปิดการใช้งานคีย์พิเศษในครั้งแรกด้วยการตั้งค่าโหมด tty เป็น "raw" SSH ทำเช่นนี้ - นี่คือวิธีที่มันสามารถถ่ายทอด กด Ctrl + C แบบโลคอลไปยังรีโมตโฮสต์)


3

ใช่มีบางอย่างที่ไม่เหมาะสม คุณกำลังกระโจนโดยตรงจากSIGINTไปSIGKILLของสัญญาณ ฉันแนะนำว่าอย่างที่คนอื่นทำดูที่การส่งSIGHUPหรือSIGTERMสัญญาณก่อนใช้ตัวเลือกนิวเคลียร์ จากนั้นก็มีความไม่สามารถในการมีสิ่งนี้ในฐานะการเชื่อมโยงคีย์ซึ่งแน่นอนว่ามันจะใช้ได้เฉพาะเมื่อ ZLE แอ็คทีฟและเชลล์กำลังโต้ตอบเพื่อให้คุณป้อนข้อมูลไม่ใช่เมื่อคำสั่งทำงาน (เพื่อที่คุณจะต้องกำหนดค่า terminal, ไม่เปลือกและจำเป็นที่จะต้องมีระเบียบวินัยสายขั้วที่ดำเนินการส่งSIGTERMเป็นส่วนขยาย POSIX ระบุพฤติกรรม.)

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

คุณตั้งค่าฟังก์ชันเชลล์เพื่อส่งสัญญาณไปยังงาน "ปัจจุบัน"

function terminate-current-job() { kill -s TERM %+ ; }

จากนั้นคุณสร้างวิดเจ็ตที่ผู้ใช้กำหนดเอง ZLE ซึ่งเรียกใช้ฟังก์ชันเชลล์นี้

zle -N terminate-current-job terminate-current-job

จากนั้นในที่สุดคุณผูกวิดเจ็ตนั้นกับกุญแจที่คุณเลือก

bindkey "^/" terminate-current-job

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