ครั้งแรกนี้ไม่เฉพาะทุบตี ATT ksh, dash และ zsh ทำงานในลักษณะเดียวกัน: จะไม่สนใจ SIGTERM และ SIGQUIT ในระหว่างบรรทัดคำสั่ง สำหรับ mksh มันก็ไม่ได้เลิก แต่ถือว่าพวกมันเหมือน SIGINT
ทั้งคู่มือ ksh และคู่มือทุบตีปรับเหตุผลโดยไม่สนใจ SIGTERM ในเงื่อนไขเหล่านี้:
เพื่อที่kill 0
จะไม่ฆ่าเชลล์แบบโต้ตอบ
kill 0
ฆ่ากระบวนการทั้งหมดในกลุ่มกระบวนการที่เชลล์เป็นin¹ โดยสรุปกลุ่มกระบวนการประกอบด้วยกระบวนการทั้งหมดที่ทำงานในเบื้องหน้าของเทอร์มินัลหรือกระบวนการทั้งหมดในพื้นหลังหรืองานที่ถูกระงับ
แม่นยำมากขึ้นนี่คือสิ่งที่เกิดขึ้นในเปลือกหอยที่ทันสมัยด้วยการควบคุมงาน ในเชลล์ดังกล่าวkill 0
จะไม่มีประโยชน์เนื่องจากเชลล์จะอยู่ในกลุ่มกระบวนการของมันเอง เชลล์ที่เก่ากว่า (หรือเชลล์ที่ทันสมัยหลังจากset +m
) ไม่ได้สร้างกลุ่มกระบวนการสำหรับคำสั่งพื้นหลัง ดังนั้นคุณสามารถใช้คำสั่งkill 0
เพื่อฆ่าคำสั่งพื้นหลังทั้งหมดโดยไม่ต้องออกจากระบบ²ดังนั้นkill 0
เหตุผลดูเหมือนเป็นคำสั่งเก่าที่ไม่ได้รับการพิสูจน์อีกต่อไปในปัจจุบัน แต่ยังคงไว้ซึ่งความเข้ากันได้ย้อนหลัง
อย่างไรก็ตามมีสถานการณ์อื่น ๆ ที่คล้ายกันซึ่งการทำให้ภูมิคุ้มกันของเชลล์มีประโยชน์ พิจารณากรณีที่คุณมีโปรเซสที่กำลังเทอร์มินัลและคุณต้องการฆ่าพวกเขาโดยไม่ต้องออกจากระบบ ระบบจำนวนมากมีเครื่องมือpkill
ที่ช่วยให้คุณสามารถฆ่ากระบวนการที่รันบนเทอร์มินัล คุณสามารถเรียกใช้pkill -t $TTY
หรือpkill -QUIT -t $TTY
ฆ่ากระบวนการทั้งหมดที่กำลังทำงานบนเทอร์มินัลปัจจุบันยกเว้นเชลล์ที่ละเว้นสัญญาณ
โดยปกติเชลล์จะหายไปเมื่อผู้ใช้ออกจากมัน (ด้วยคำสั่งเหมือนexit
หรือlogout
) หรือเมื่อเทอร์มินัลส่งสัญญาณจุดสิ้นสุดของอินพุต (ผู้ใช้สามารถทำให้เกิดสิ่งนี้ได้โดยการกดCtrl+ D) หรือหายไปโดยสิ้นเชิง ในกรณีสุดท้ายนี้เชลล์ได้รับสัญญาณ SIGHUP และจะไม่เพิกเฉยต่อสัญญาณนั้น
สำหรับกรณีการใช้งานของคุณในการออกจากระบบของ X session นั้นkill -15 -1
จะทำเพราะมันจะทำการจำลองเทอร์มินัลซึ่งทำให้เชลล์ได้รับ SIGHUP ในความเป็นจริงมันเพียงพอแล้วที่จะฆ่าเซิร์ฟเวอร์ X แต่ต้องค้นหา ID กระบวนการของมัน kill -15 -1; exit
หากคุณต้องการคำสั่งเดียวกันกับการทำงานในเซสชั่นข้อความคุณสามารถใช้ นั่นเป็นคำสั่งที่อันตรายที่จะมีอยู่แค่ปลายนิ้วของคุณ
¹ ดูเหมือนจะไม่ได้กล่าวถึงในคู่มือเชลล์ว่าเป็นกฎ มันเป็นคุณสมบัติของการโทรระบบพื้นฐาน มันถูกกล่าวถึงอย่างชัดเจนในข้อกำหนด POSIX
² ทุกวันนี้ในการทำเช่นนั้นเรียกใช้jobs -l
เพื่อดูรายการของงานที่มี ID กลุ่มกระบวนการของพวกเขาแล้วkill -123 -456 …
เพื่อฆ่ากลุ่มกระบวนการ
/bin/kill
หรือเปลือก builtin? ถ้าอย่างหลังฉันเดาว่ากระสุนจะไม่ฆ่าตัวเองด้วยตัวมันเอง