วิธีฆ่าหลายกระบวนการ


21

ค้นหา PID ของกระบวนการเพื่อฆ่าการใช้:

pgrep <process command>

ฉันใช้คำสั่ง kill เพื่อฆ่า PID ที่ส่งคืนโดย pgrep <process command>

kill <PID>

คำสั่งเหล่านี้สามารถนำมารวมกันเป็นหนึ่งเพื่อให้สามารถฆ่า PID หรือ PID กลับโดยpgrep <process command>? หรือมีวิธีการฆ่าหลายกระบวนการด้วยชื่อคำสั่ง?

สิ่งที่ต้องการ : kill(pgrep <name of process>)


3
คุณลองpkillไหม xargsหรือคุณอาจต้องการใช้
MatthewRock

1
โปรดทราบว่า man pages นั้นดีสำหรับสิ่งนี้ บ่อยครั้งที่พวกเขาไม่เพียงบอกวิธีใช้คำสั่งพวกเขายังบอกคุณเกี่ยวกับคำสั่งที่เกี่ยวข้อง ในกรณีนี้pgrepman page กล่าวถึงpkillสถานที่ (เนื่องจากคำสั่ง 2 มาจากแพ็คเกจเดียวกัน)
Patrick

คำตอบ:


27

คุณสามารถใช้ pkill:

pkill httpd

คุณอาจต้องการใช้การทดแทนกระบวนการ (แม้ว่านี่จะไม่ชัดเจน):

kill $(pgrep command)

และคุณอาจต้องการใช้xargs:

pgrep command | xargs kill

4
ฉันทำสิ่งเดียวกันในคำตอบและมันก็ชี้ให้ฉันเห็นว่าฉันแนะนำสภาพการแข่งขัน รหัสกระบวนการอาจจะถูกยกเลิก inbetween สายไปและpgrep ใช้เพียงแค่kill pkill
Kusalananda

3
@KanDananda สิ่งเดียวกันสามารถเกิดขึ้นpkillได้ระหว่างการรับรายการกระบวนการและการส่งสัญญาณจริง ๆ มันเป็นเรื่องยากที่จะเห็นในกรณีนั้น
ฮอบส์

1
ฉันจะพยายามเขียนคำตอบที่วนลูปบางอย่างkill $(ps|head -1)เพื่อหลีกเลี่ยงสภาพการแข่งขัน ... แต่ไม่มีทางที่จะหลีกเลี่ยงได้ กระบวนการอาจตายที่จุดใด ๆ ในท่อ
Ross Presser

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

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

17

คุณสามารถใช้killallเช่นกัน

killall firefox

เพื่อส่งSIGTERMไปยังfirefoxกระบวนการทั้งหมด


8
โปรดทราบว่าkillallมีความหมายที่แตกต่างกันในระบบยูนิกซ์ที่แตกต่างกัน - ถ้าคุณอยู่ในระบบที่ไม่ใช่ Linux ให้ตรวจสอบเอกสาร
Random832

killall -KILL firefoxสามารถรู้สึกsoooรางวัล
ท่อ

การไม่พกพาkillallเป็นสิ่งที่ฉันไม่เคยใช้ killallตัวอย่างเช่นการวิ่งบนกล่องโซลาริสเป็นหายนะ
แพทริค

9

ใช่คุณสามารถใช้คุณสมบัติทุบตีและวนลูปมากกว่าเอาท์พุท

$ for proc in $(pgrep <process command>); do kill $proc; done

ฉันได้รับkill <no>:failed: operation not permitted
Timo

อาจเป็นเพราะคุณไม่มีสิทธิ์ที่ถูกต้องหรือกระบวนการไม่มีอยู่อีกต่อไปโปรดดูที่: superuser.com/questions/1175485/…
lcipriani

0

คุณสามารถฆ่าหลายกระบวนการด้วยอาเรย์ ในกรณีนี้คุณสามารถระบุตัวเลือกเป็น$ip, $hostnameหรือสิ่งที่คล้ายกัน

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.