จะฆ่ากระบวนการทั้งหมดด้วยชื่อที่กำหนดได้อย่างไร


16

ฉันเรียกใช้คำสั่งps -A | grep <application_name>และรับรายการกระบวนการเช่นนี้:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

19440ฉันต้องการที่จะฆ่ากระบวนการทั้งหมดจากรายการ 21630, 22694,

ฉันลองแล้วps -A | grep <application_name> | xargs kill -9 $1แต่ใช้งานได้กับข้อผิดพลาด

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

ฉันจะทำสิ่งนี้ได้อย่างสง่างาม

คำตอบ:



9

ปัญหาคือps -A | grep <application_name> | xargs -n1ส่งคืนผลลัพธ์เช่นนี้

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

คุณสามารถใช้awkการได้รับครั้งแรกคอลัมน์ของpsเอาท์พุท

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

จะส่งคืนรายการ PID

19440
21630
22694

และเพิ่มkill -9 $1คุณมีคำสั่งที่ฆ่า PID ทั้งหมด

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1

นี้คือการทดสอบที่สมบูรณ์แบบฉันไว้ในสคริปต์ทุบตีมันฆ่า processer ทันทีไม่มีข้อผิดพลาด + แม้ว่า is'nt กระบวนการเริ่มต้นมันแสดงให้เห็นไม่มีข้อผิดพลาดซึ่งเป็นสิ่งที่ฉันต้องการที่นี่เป็นตัวอย่างของนักฆ่า processer nano /usr/bin/ffmpegk ffmpeg, . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F

ฉันมีปัญหากับสิ่งนี้ที่ฉันได้รับผลลัพธ์kill -9หากไม่มีกระบวนการที่ตรงกัน
Daniel F

1
แทนที่จะเป็นgrepคุณควรใช้awkเพื่อจับคู่ชื่อ:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight

0

killall สามารถทำได้

$ killall application_name

kill ทั้งหมดอนุญาตให้ใช้นิพจน์ทั่วไปในชื่อแอปพลิเคชันหรือไม่
Łukasz D. Tulikowski

killall --regexp "appl.*me"แม้ว่าอาจจะมีการใช้งาน killall ที่แตกต่างกัน man killallดู
rudimeier

killall ไม่เพียงพอในบางครั้งฉันต้องส่งสามครั้งเพื่อฆ่ากระบวนการและแม้แต่ล้มเหลวในการฆ่ามันโซลูชันการทำงานที่รวดเร็วเพียงอย่างเดียวสำหรับฉันคือ kill -9 pidฉันคิดว่า @ ŁukaszD.Tulikowskiเป็นโซลูชันการทำงานที่ดีที่สุดสำหรับสคริปต์ทุบตีโดยเฉพาะ
Salem F

-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh

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

-2

วิธีการของฉันคล้ายกับ @ Łukasz D. Tulikowskiของ แทนการใช้grep <application_name>; ฉันใช้grep "[a]pplication_name"ซึ่งไม่ตรงกับบรรทัดคำสั่งกระบวนการของตัวเอง

นิพจน์วงเล็บเหลี่ยมเป็นส่วนหนึ่งของการgrepจับคู่รูปแบบคลาสอักขระ (อ้างอิง)


คุณสามารถใช้awkรับคอลัมน์แรกของpsเอาต์พุต

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

จะส่งคืนรายการ PID

7644
407
406

การเพิ่มภายหลังkill -9 $1คุณมีคำสั่งที่ฆ่า PID ทั้งหมด

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1

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