การค้นหา ID ของกระบวนการและฆ่ามัน


16

เมื่อใดที่ฉันต้องฆ่ากระบวนการพื้นหลังที่ฉันทำ ps -e | grep <process_name>

ซึ่งพิมพ์บางอย่างเช่นนี้1766 ? 00:00:13 conkyจากนั้นฉันใช้ ID กระบวนการในการkillkill 1766มันชอบ

มีวิธีใดที่ฉันสามารถทำให้สิ่งนี้ง่ายขึ้น? ทำให้เร็วขึ้นไหม ลดจำนวนการพิมพ์หรือไม่


1
ฉันได้รับคำตอบที่ต้องการ แต่ฉันจะรอสักครู่ก่อนที่จะยอมรับเพื่อให้ชุมชนได้รับประโยชน์จากตัวเลือกต่างๆที่มีให้
Gautam

โปรดอย่าลังเลที่จะทำให้คำถามนี้เป็นเรื่องทั่วไปมากขึ้นถ้าเป็นไปได้เพื่อให้ผู้คนจำนวนมากได้รับประโยชน์จากคำตอบ
Gautam

คำตอบ:


19

(TL, DR: pgrep,pkill )

หลายตัวแปร Unix มาพร้อมกับpgrepและสหายpkill: Solaris , ลินุกซ์ (ส่วนหนึ่งของสาธารณูปโภคกระบวนการมาตรฐานอาจจะหายไปจากระบบลินุกซ์ฝังตัว), FreeBSD , OpenBSD , NetBSD , ... แต่เฉพาะจาก MacPorts บน OS X , ไม่ AIXและเพียง เมื่อเร็ว ๆ นี้ใน HP-UX pgrepยูทิลิตี้แสดงให้เห็นถึงกระบวนการ ID ของกระบวนการจับคู่โดยใช้ชื่อผู้ใช้และเกณฑ์อื่น ๆ ไม่กี่ อาร์กิวเมนต์pgrepถูกตีความว่าเป็น regexp ที่จะต้องตรงกับส่วนหนึ่งของชื่อปฏิบัติการของกระบวนการ (เว้นแต่คุณจะผ่านตัวเลือกในการเปลี่ยนแปลงนี้) หากคุณโทรมาpkillแทนpgrepยูทิลิตี้ส่งสัญญาณแทนการแสดง ID กระบวนการ

อีกยูทิลิตี้ที่คล้ายกันคือpidof บนLinuxนั้นให้บริการโดยSysVinitหรือBusyBox (ดังนั้นคุณมักจะพบมันบนระบบ Linux ที่ไม่มีอยู่pgrep) นอกจากนี้ยังมีพอร์ตในรุ่นอื่น ๆ ของยูนิกซ์ pidofยูทิลิตี้มีตัวเลือกน้อยลงมันเป็นส่วนใหญ่เท่านั้นตรงกับชื่อแฟ้มที่ปฏิบัติการทั้งหมด ยูทิลิตี้สหายมันkillallส่งสัญญาณไปยังโปรแกรมที่ตรงกัน¹

¹ ระวังที่killallมีความหมายแตกต่างกันใน Solaris และอาจแตกต่างจากระบบปฏิบัติการยูนิกซ์อื่น ๆ ห้ามพิมพ์killallเป็นรูทบน Solaris


ว้าวคำตอบของคุณมีรายละเอียดมากขึ้นในเชิงลึกมากขึ้นขอบคุณ โปรดแก้ไขคำถามเพื่อให้ตรงกับคำตอบถ้าเป็นไปได้
Gautam

@GautamK ฉันไม่คิดว่าคำถามจะต้องขยายตัว ถ้าเป็นเช่นนั้นคุณสามารถแก้ไขได้ด้วยตนเอง
Gilles 'หยุดชั่วร้าย'

จากคำตอบที่มีจำนวนโหวตมากที่สุดคำตอบของคุณให้รายละเอียดเพิ่มเติมดังนั้นฉันจึงยอมรับ
Gautam

8
  • killall ProcessName (มีข้อเสียกับคำสั่งนี้เนื่องจากคุณไม่ทราบชื่อกระบวนการของโปรแกรมเสมอ)
  • pidof ProccessName และ kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 ลองใช้หนึ่งบรรทัดนี้และนำประวัติของ bash กลับมาใช้ใหม่หรือสร้างชื่อแทนให้ดีกว่า

วินาทีpidofดูเหมือนง่ายขึ้นเล็กน้อย แต่ก็ยังมี 2 ขั้นตอน
Gautam

ฉันสามารถค้นหา / สร้างคำสั่งหนึ่งบรรทัดที่ทำได้ในขั้นตอนเดียว (ด้วยชื่อกระบวนการแบบคร่าว ๆ ) แต่คุณต้องพิมพ์บรรทัดยาว (ซึ่งยากกว่าที่สองขั้นตอนข้างต้น) หรือคุณสามารถพิมพ์ครั้งเดียว และนำประวัติมาใช้ซ้ำ
Hanan N.

@GautamK ฉันได้อัปเดตคำตอบด้วยตัวเลือกคำสั่งเดียว
Hanan N.

6

ในขณะที่ฮานันมีคำแนะนำที่ดีบางอย่างฉันจะเพิ่ม/pgrep pkillพวกเขาอนุญาตให้ควบคุมกระบวนการที่คุณค้นหาได้อย่างละเอียดและนิพจน์ทั่วไปหากคุณไม่ทราบว่ากระบวนการที่แม่นยำที่คุณต้องการฆ่านั้นเป็นอย่างไร

PS Hanan pidofสามารถให้อาหารkillกับ backticks โดยตรง:

kill `pidof processname`

pkillคือสิ่งที่ผมกำลังมองหาผมใช้เวลาส่วนใหญ่ทราบชื่อกระบวนการที่ส่วนใหญ่ของมันconkyหรือfirefoxหรือchromeบางสิ่งบางอย่างหรืออย่างนั้น ขอบคุณ
Gautam

1

เกี่ยวกับเรื่องนี้ -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

ตัวอย่าง:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

ปรับปรุง:

ขออภัยนี้เห็นได้ชัดไม่ตอบสนองความต้องการในการพิมพ์น้อยจึงเป็นวิธีที่ดีในการทำก็จะไปเพิ่มfunctionที่คุณ.bashrc, .profileหรืออะไรก็ตามสคริปต์เริ่มต้น ฟังก์ชั่นสามารถเป็นอะไรเช่นนี้ -

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

เมื่อเพิ่มแล้วคุณสามารถส่งชื่อกระบวนการของคุณได้:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.