วิธีการให้ข้อโต้แย้งเพื่อฆ่าทางท่อ


85

ฉันต้องการค้นหากระบวนการบางอย่างและฆ่ากระบวนการนั้น ฉันเขียนคำสั่งดังนี้:

ps -e | grep dmn | awk '{print $1}' | kill

dmnที่ไหนชื่อกระบวนการคือ แต่มันไม่ทำงาน ฉันจะค้นหากระบวนการตามชื่อและกระบวนการkillได้อย่างไร

คำตอบ:


162
kill $(ps -e | grep dmn | awk '{print $1}')

8
ใช้$()ไวยากรณ์ที่ใหม่กว่า: kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D

7
fwiw สำหรับคนอื่นฉันต้องแก้ไขคำตอบนี้เพื่อให้มันใช้งานkill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')ได้: ไม่แน่ใจว่าทำไมและไม่สนใจมากพอที่จะดูเพิ่มเติมในนั้น
joshweir

1
@joshweir เป็นเพราะkillพยายามฆ่าแม้กระทั่งกระบวนการ 'grep' ซึ่งพยายามค้นหารูปแบบ
meain

จะไม่จำเป็นต้องใช้\nหลังจากแต่ละ awk เช่นในawk '{print $1"\n"}'?
Sopalajo de Arrierez

45

ในกรณีที่มีหลายกระบวนการที่คุณต้องการลบคุณสามารถใช้สิ่งนี้:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

หมายเหตุ: คุณต้องลบกระบวนการ grep ออกจากเอาต์พุตนั่นคือเหตุผลที่grep -v grepใช้


17
คุณสามารถหลีกเลี่ยงไม่ให้ grep ปรากฏใน grep ของคุณได้โดยใส่ถ่านตัวแรกไว้ในวงเล็บเช่น: grep [d] mn
Oldskool

1
@Oldskool เคล็ดลับดีๆ การใช้ metacharacteres เพื่อทำให้นิพจน์ทั่วไป grep ไม่ตรงกับตัวมันเองเป็นความคิดที่ดี
jcollado

@Oldskool +1 คุณเป็นอัจฉริยะ!
jcr

เคล็ดลับที่ดีแม้ว่าจะทำให้ซับซ้อนมากขึ้นในการเปลี่ยนเป็นเชลล์สคริปต์
Metagrapher

17

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

pkill dmn 

ถ้าระบบของคุณมีคำสั่ง pkill


1
+1 สำหรับ pkill แทนที่จะเป็น killall มีให้บริการในหลายแพลตฟอร์มโดยไม่มี "ความหมาย" ที่แตกต่างกัน (เช่นkillallบน Solaris เทียบเท่ากับkillall5บน Linux - นั่นคือฆ่ากระบวนการทั้งหมด )
plundra

4

แค่เพิ่มคนอื่น ๆ แต่ฉันชอบใช้ความจุคุณสมบัติ regex ของ awk:

kill $(ps | awk '/dmn/{print $1}')

4

หากคุณมีpidofคำสั่งในระบบของคุณ (ฉันรู้ว่าเชลล์เช่น ZSH มาพร้อมกับสิ่งนี้โดยค่าเริ่มต้นเว้นแต่ฉันจะเข้าใจผิด) คุณสามารถทำสิ่งต่างๆเช่น.

kill -9 $(pidof dmn)


2

คุณอาจไม่ต้องการpipeสิ่งนี้หากคุณมีpidofคำสั่งและรู้ชื่อภาพฉันก็ทำแบบนี้:

kill $(pidof synergyc)

$()ฉันเข้าใจสิ่งนี้เนื่องจากมันแปลงเอาต์พุตนั้นเป็นตัวแปรที่ kill สามารถใช้ได้โดยพื้นฐานแล้วเหมือนกับที่ไพพ์ทำ สั้นและเข้าใจง่ายกว่าตัวเลือกอื่น ๆ แต่อาจยืดหยุ่นน้อยกว่าและตรงกว่า


0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

สวัสดีเพื่อน ๆ .. เราสามารถทำได้โดยใช้ห่วง

"การค้นหาบางรายการ" อยู่ที่นี่ชื่อกระบวนการที่คุณต้องการค้นหาตัวอย่างเช่น "java" ดังนั้นสมมติว่าจำนวนกระบวนการ java คือ 200+ ดังนั้นการฆ่าทีละรายการจะเป็นเรื่องปกติเกินไป

เพื่อให้คุณสามารถใช้คำสั่งดังกล่าวได้

ขอบคุณ.


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