สมมติว่าฉันมีหนึ่งพันหรือมากกว่าอินสแตนซ์ของกระบวนการใด ๆ (ตัวอย่างเช่นvi
) ทำงาน ฉันจะฆ่าพวกเขาทั้งหมดในหนึ่งนัดเดียว / คำสั่งหนึ่งบรรทัด / คำสั่งเดียวได้อย่างไร
สมมติว่าฉันมีหนึ่งพันหรือมากกว่าอินสแตนซ์ของกระบวนการใด ๆ (ตัวอย่างเช่นvi
) ทำงาน ฉันจะฆ่าพวกเขาทั้งหมดในหนึ่งนัดเดียว / คำสั่งหนึ่งบรรทัด / คำสั่งเดียวได้อย่างไร
คำตอบ:
มีอะไรผิดปกติกับคนดี
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
มีวิธีที่จะทำให้มันมีประสิทธิภาพมากขึ้น
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
และรูปแบบอื่น ๆ แต่ในระดับพื้นฐานมันใช้งานได้สำหรับฉันเสมอ
echo kill -9 $pid
ครั้งแรกอยู่แล้วเพื่อให้ฉันรู้ว่าสิ่งที่ฉันได้รับ ฉันไม่แน่ใจว่า AIX มีpkill
ซึ่งเป็นขนมปังและเนย UNIX ของฉัน และมันก็แย่มากพอที่จะลงคะแนน - แปลก
csh
ใช้ killall
killall vi
นี้จะฆ่าคำสั่งทั้งหมดชื่อ 'vi'
คุณอาจเพิ่มสัญญาณได้เช่นกันเช่น SIGKILL
killall -9 vi
killall -9 vi
killall
ทำสิ่งที่ชื่อแนะนำ ... มันฆ่ากระบวนการเริ่มต้น
pkill
เป็นสิ่งที่ฉันแนะนำถ้ามี ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ) คุณสามารถระบุกระบวนการตามชื่อคำสั่งโดยบรรทัดคำสั่งแบบเต็มหรือเกณฑ์อื่น ๆ ยกตัวอย่างเช่นฆ่าโปรแกรมทั้งหมดที่มีชื่อคำสั่งมีอักขระย่อยpkill vi
vi
เพื่อฆ่ากระบวนการที่เรียกว่าvi
ใช้pkill -x vi
เท่านั้น เพื่อฆ่ากระบวนการเฉพาะที่เรียกว่าvi
มีอาร์กิวเมนต์สุดท้ายสิ้นสุดในการใช้งาน.conf
pkill -fx 'vi.*\.conf'
หากต้องการดูรายการ PID ที่pkill
จะส่งสัญญาณให้ใช้pgrep
ซึ่งมีรูปแบบเหมือนกันทุกประการยกเว้นว่าจะไม่ยอมรับชื่อสัญญาณหรือหมายเลข หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการเหล่านี้ให้เรียกใช้
ps -p "$(pgrep …)"
ภายใต้ Linux คุณต้องการps -p $(pgrep -d, …)
แทน (นั่นเป็นข้อผิดพลาด: Linux ps
ไม่เข้ากับ POSIX)
อีกวิธีทั่วไปในการระบุกระบวนการที่จะฆ่าคือกระบวนการที่มีไฟล์เปิดอยู่ (ซึ่งสามารถปฏิบัติการได้ของกระบวนการ) คุณสามารถแสดงรายการเหล่านี้ด้วยfuser
; ใช้fuser -k
สำหรับส่งสัญญาณ ตัวอย่างเช่นการfuser -k /usr/bin/find
ฆ่าทั้งหมดที่ทำงานอยู่find
นั้นไม่ใช่
หากมีกระบวนการที่ต้องหลบหนีคุณจะต้องฆ่ากลุ่มกระบวนการทั้งหมดในครั้งเดียว กลุ่มกระบวนการถูกระบุโดยค่าลบของผู้นำซึ่งเป็นกระบวนการบรรพบุรุษของกระบวนการทั้งหมดในกลุ่ม หากต้องการดูกลุ่มกระบวนการที่เป็นของกระบวนการให้เรียกใช้ps -o pgid
(รวมถึงตัวเลือกใด ๆ เพื่อเลือกกระบวนการที่จะแสดง) หากคุณพิจารณาว่าคุณต้องการฆ่าหัวหน้ากลุ่มกระบวนการ 1234 และลูก ๆ ของกลุ่มทั้งหมดให้รันkill -1234
หรือkill -HUP -1234
หรือสัญญาณอื่น ๆ
หากคุณไม่พบวิธีที่ดีกว่าให้ใช้ps
กับตัวเลือกที่เหมาะสมเพื่อแสดงรายการกระบวนการทั้งหมดและกรองด้วยgrep
หรือคำสั่งการกรองข้อความอื่น ๆ ระวังอย่าจับคู่กระบวนการอื่นที่บังเอิญใช้คำสั่งด้วยชื่อที่คล้ายกันโดยไม่ตั้งใจหรือด้วยอาร์กิวเมนต์ที่มีชื่อนั้น ตัวอย่างเช่น:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
โปรดจำไว้ว่าคำสั่งgrep
หรือawk
คำสั่งของคุณอาจแสดงอยู่ในps
เอาต์พุต ( ps
และคำสั่งการกรองจะเริ่มต้นพร้อมกันดังนั้นไม่ว่ามันจะปรากฏขึ้นหรือไม่ขึ้นอยู่กับเวลา) นี่เป็นสิ่งสำคัญอย่างยิ่งหากอาร์กิวเมนต์คำสั่งรวมอยู่ในps
เอาต์พุต
pkill
ดีมากที่นี่ คุณสามารถให้พารามิเตอร์จำนวนมากเพื่อปรับแต่งรูปแบบ
pkill
ให้บริการบน Linux, BSD และ Solaris - afaik killall
ดังนั้นจึงมีการแพร่กระจายมีขนาดใหญ่กว่า
วิธีที่ง่ายที่สุดคือตรวจสอบก่อนว่าคุณได้รับรหัสกระบวนการที่ถูกต้องด้วย:
pgrep -f [part_of_a_command]
หากผลเป็นไปตามที่คาดไว้ ไปกับ:
pkill -f [part_of_a_command]
pgrep -f "command name"
ไม่มีใครพูดถึงสิ่งนี้ที่น่าสนใจ pidofเอาต์พุต pids ที่คั่นด้วยช่องว่างของกระบวนการที่ตรงกับชื่อกระบวนการที่ส่งผ่าน คุณสามารถใช้เอาต์พุตโดยตรงkill
โดยไม่ต้องมีpiping บน Arch Linux ฉันใช้
kill -9 $(pidof <proc name>)
ข้อเสียของโซลูชันนี้คือไม่อนุญาตให้ใช้นิพจน์ทั่วไป
pkill
ผมขอแนะนำให้คุณลอง
Ex: ps -ef | pkill -f command
หากต้องการแสดงรายการของกระบวนการทั้งหมดที่จะฆ่าก่อนลองpgrep
:
Ex: ps -ef | pgrep -f command
ps -ef
ไปยังpkill
หรือท่อpgrep
? คำสั่งเหล่านี้ไม่ได้อ่านจากอินพุตมาตรฐาน
คุณสามารถฆ่ากระบวนการต่าง ๆ ได้หลายอย่างโดยใช้คำสั่งด้านล่าง
pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"
โปรดทราบว่านี่จะฆ่ากระบวนการที่ตรงกับรูปแบบข้างต้นซึ่งหมายความว่าprocess1abc
process2def
process3ghi
จะได้รับการฆ่าด้วย
pgrep "name-of-application" | xargs kill -9
ง่ายพอที่จะจดจำและทำงานได้ดีสำหรับฉัน
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
จากprocps
แพ็คเกจ