จะฆ่าทั้งกระบวนการและกระบวนการย่อยได้อย่างไร


9

ฉันถาม คำถามเพื่อทราบวิธีรับข้อความหลายบรรทัดจากโมดูลย่อยของ Python

ปัญหาคือว่าในระหว่างการทดสอบฉันต้องฆ่ากระบวนการหลามที่ใช้กระบวนการ gnuchess การใช้ ^ c ในบรรทัดคำสั่งดูเหมือนว่าจะฆ่ากระบวนการไพ ธ อน

สำหรับการฆ่า gnuchess ฉันได้ pid ด้วยps aux | grep gnuchessและเรียกใช้ฆ่า -9 PID มีวิธีอื่นที่จะฆ่าทั้งกระบวนการของ python และ gnuchess หรือไม่?


8
สุ่ม sidenote: คุณสามารถใช้pkillเพื่อฆ่ากระบวนการตามชื่อดังนั้นคุณps aux | grep gnuchessและkill -9 PIDสามารถกลายเป็นได้pkill -9 gnuchess
Michael Mrozek

คำตอบ:


10

มีวิธีการมาตรฐานถ้าโปรแกรมร่วมมือ รันkill -- -42โดยที่ 42 คือ pid ของกระบวนการพาเรนต์ สิ่งนี้ส่งสัญญาณไปยังกระบวนการทั้งหมดในกลุ่มกระบวนการนำโดยกระบวนการ 42 (เครื่องหมายลบก่อน pid หมายถึงกลุ่มกระบวนการ)

โดยปกติถ้าคุณเรียกใช้สคริปต์ python ของคุณจาก shell prompt และเพียงแค่gnuchessดำเนินการทั้งสองกระบวนการจะยังคงอยู่ในกลุ่มกระบวนการเดียวกัน แต่นี่ไม่ใช่กรณีเนื่องจากCtrl+ Cส่งSIGINTไปยังกลุ่มกระบวนการพื้นหน้าทั้งหมด

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


วิธีที่เชื่อถือได้อย่างสมเหตุสมผลและสอดคล้องกับ POSIX ในการค้นหา pid ของgnuchessกระบวนการคือ

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

pgrepเฉพาะยูนิกซ์สายพันธุ์อาจจะมีวิธีที่ดีกว่าในการบรรลุนี้เช่น


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