คุณจะฆ่าต้นไม้กระบวนการใน linux ได้อย่างไร? [ปิด]


14

บางครั้งการส่ง SIGTERM ไปยังกระบวนการจะทำให้ SIGTERM ส่งไปยังกระบวนการลูกทั้งหมด อย่างไรก็ตามบางครั้งสิ่งนี้ไม่ทำงาน

มีคำสั่งหรือยูทิลิตี้ที่อนุญาตให้ฉันฆ่ากระบวนการและกระบวนการลูกทั้งหมดในเวลาเดียวกันได้หรือไม่? ฉันมักจะหันไปเก็บรวบรวม pids ทั้งหมดด้วยตนเองในคำสั่ง kill เดียว แต่ก็รู้สึกโง่

คำถาม SO นี้ถามว่าจะทำอย่างไรกับ Perl แต่สิ่งใดก็ตามที่ทำให้งานสำเร็จจะดี


ดูเหมือนว่าpkill -9จะมีพลังมากกว่าpkillด้วยเหตุผลใดก็ตาม
แอนดรู

คำตอบ:



13

สมมติว่ากระบวนการแบ่งปันตัวระบุเซสชัน (ซึ่งพวกเขาควรจะยกเว้นว่าพวกเขาได้เรียกอย่างชัดเจน setsid () คุณสามารถฆ่าพวกเขาโดยเซสชั่นโดยใช้ pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

ถ้ามาจากเทอร์มินัลอื่นฉัน:

pkill -9 -s 12804

จากนั้นทุกอย่างก็ตายในบัดดล

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


2

โดยปกติแล้วไคลเอ็นต์ที่ตอบสนองควรได้รับ sigterm และปิดตัวเองดังนั้นจึงยุติกระบวนการลูกที่แยกทั้งหมด หากในทางกลับกันลูกค้าไม่ตอบสนองสัญญาณการเลิกจ้างปกติอาจทำให้ไม่ตอบสนอง

ดังนั้นคุณจึงดำเนินการส่ง SIGKILL ซึ่งบอกให้ระบบหยุดการทำกระบวนการนั้นตอนนี้ซึ่งมันสามารถทำเกือบทุกครั้งยกเว้นเมื่อกระบวนการอยู่ในสถานะสลีนอินเทอร์เบิเบิลเบิลเช่นรอ I / O บางตัว อินพุตหรือคล้ายกัน

ในกรณีนั้นแม้แต่ SIGKILL ก็จะไม่ทำอะไรกับกระบวนการ กระบวนการลูกอาจจะอยู่ในภาวะชะลอตัวแบบเดียวกัน

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


2

ถ้าฉันต้องการที่จะฆ่าแผนผังกระบวนการของ Firefox ก็เป็นไปได้ที่จะฆ่ามันโดยคำสั่งดังกล่าว "pkill -9 -s firefox"

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