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


622

ฉันต้องการฆ่ากระบวนการทั้งหมดที่ได้รับโดย:

ps aux | grep my_pattern

ทำอย่างไร?

สิ่งนี้ไม่ทำงาน:

pkill my_pattern

11
เป็นmy_patternเพียงย่อยของชื่อหรือไม่ก็มีการใด ๆ อักขระ regex พิเศษหรือไม่?
Sven Marnach

คำตอบ:


1317

ใช้pkill -fซึ่งตรงกับรูปแบบสำหรับส่วนใด ๆ ของบรรทัดคำสั่ง

pkill -f my_pattern

7
@ Jayan: มันค่อนข้างจะไม่แยกแยะในการฆ่า มันเป็นเรื่องน่าแปลกใจที่ง่ายต่อการทำผิด ...
thkala

1
@ Jayan: คุณจะไม่เชื่อฉัน :-) ฉันถูกเบิร์นมากเกินไปหลายครั้งโดยสคริปต์ของบุคคลที่สามซึ่งยืนยันในการใช้งานpkill- ข้อผิดพลาดที่พบบ่อยที่สุดคือการสันนิษฐานว่ามีเพียงหนึ่งอินสแตนซ์ของไบนารีแต่ละตัวเท่านั้นที่สามารถมีอยู่ได้ทุกเวลา
thkala

4
สำหรับผู้ใช้ Mac ใด ๆ ที่หาคำตอบนี้เช่นผมเทียบเท่า Mac killall -m my_patternเป็น
Zev Eisenberg

1
หากคุณมีกระบวนการแขวนจำนวนมากซึ่งไม่ถูกฆ่าให้ใช้ pkill -f -9 เพื่อฆ่าพวกมันอย่างไร้ความปราณี
MacK

18
ฉันแนะนำให้ใช้pgrepก่อนเพื่อตรวจสอบสิ่งที่คุณกำลังจะฆ่า คุณสามารถใช้pgrep -lเพื่อดูชื่อกระบวนการหรือpgrep -aดูบรรทัดคำสั่งแบบเต็ม มันใช้ธงเช่นเดียวกับ pkill pgrep -fa my_patternดังนั้นในกรณีนี้คุณสามารถใช้
studgeek

158

ฆ่ากระบวนการทั้งหมดที่ตรงกับสตริง "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

ที่มา: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

รหัสนี้กำลังทำอะไรอยู่?

การps -efสร้างรายการของรหัสกระบวนการบนคอมพิวเตอร์ที่ผู้ใช้รายนี้มองเห็นได้ ไปป์ที่ grep ตัวกรองที่ลงสำหรับแถวที่ประกอบด้วยสตริงนั้น The grep -v grepsays ไม่ตรงกับกระบวนการของตัวเองที่ทำ grepping การพิมพ์ไปป์ awk บอกว่าแบ่งแถวบนตัวคั่นช่องว่างเริ่มต้นและตัวกรองไปยังคอลัมน์ที่สองซึ่งเป็นรหัสกระบวนการของเรา ไปป์ไลน์ xargs หมุนกระบวนการใหม่เพื่อส่ง pid ทั้งหมดของไปที่kill -9พวกเขาทั้งหมด

รหัสข้างต้นไม่ดี, อันตราย, น่าเกลียดและแฮ็กด้วยเหตุผลหลายประการ

  1. หากรหัสกำลังสิ้นสุดลงกำลังทำฐานข้อมูลใด ๆ หรือทำธุรกรรมที่ปลอดภัยด้วยสภาพความน่าจะเป็นที่มีการแข่งขันต่ำเศษเสี้ยวของเปอร์เซ็นต์ของเวลาส่วนอะตอมมิกของการทำธุรกรรมนั้นจะถูกทำลายทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด kill -9 ไม่มีนักโทษ หากรหัสของคุณไวต่อสิ่งนี้ลองเปลี่ยนชิ้นxargs killส่วนด้วยค่าสถานะการส่งที่ร้องขอการปิดระบบอย่างนุ่มนวลและหากคำขอนั้นถูกปฏิเสธสุดท้ายจะเปลี่ยนเป็นkill -9

  2. มีความเป็นไปได้ที่ไม่เป็นศูนย์ที่คุณจะหยุดระบบปฏิบัติการโดยไม่ตั้งใจหรือก่อให้เกิดพฤติกรรมที่ไม่ได้กำหนดในกระบวนการที่ไม่เกี่ยวข้องซึ่งนำไปสู่ความไม่แน่นอนของระบบทั้งหมดเนื่องจากps -efรายการกระบวนการที่เป็นไปได้ทั้งหมดที่มีอยู่ ชื่อกระบวนการหรือว่าในช่วงเวลาระหว่างการอ่านและดำเนินการฆ่า -9 กระบวนการได้เปลี่ยนไปเป็นอย่างอื่นและตอนนี้คุณได้สิ้นสุดกระบวนการสุ่มบางอย่างที่คุณไม่ได้ตั้งใจ

แต่ถ้าคุณเข้าใจความเสี่ยงและการควบคุมสำหรับพวกเขาด้วยชื่อที่ไม่ซ้ำกันมากและคุณก็โอเคกับการทำธุรกรรมที่ลดลงเล็กน้อยหรือข้อมูลเสียหายเป็นครั้งคราวจากนั้น 99.9% ของเวลาที่คุณจะต้องทำ หากมีปัญหาให้รีบูทคอมพิวเตอร์ตรวจสอบให้แน่ใจว่าไม่มีการชนกันของกระบวนการ มันเป็นเพราะรหัสเช่นนี้ที่ทำให้สคริปต์สนับสนุนเทคโนโลยี: "คุณลองรีสตาร์ทเครื่องคอมพิวเตอร์ของคุณ" เป็น meme ระดับ 5


15
สิ่งนี้จะทำให้เกิดข้อผิดพลาดหากไม่พบกระบวนการที่ตรงกับชื่อ คุณอาจต้องการใช้ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9เพื่อให้ xargs ไม่เรียกใช้งานคำสั่งหากไม่ได้รับอาร์กิวเมนต์
Epigene

2
เพียงแค่การปรับเปลี่ยนเล็กน้อยอาจเป็นการดีกว่าถ้าจะอ้างชื่อกระบวนการ: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 หากไม่มีเครื่องหมายอัญประกาศกระบวนการโพรเซสของฉันเท่านั้นที่ถูกฆ่าในการเรียกใช้ครั้งแรก เรียกใช้อีกครั้งฆ่าส่วนที่เหลือ
Ali Haider

-rตัวเลือกไม่มีอยู่ใน OS X ดังนั้นจึงดูเหมือนว่า
Danijel

52

หากคุณต้องการความยืดหยุ่นมากขึ้นในการเลือกกระบวนการที่ใช้

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

คุณสามารถใช้ grep -e เป็นต้น


4
-1 คุณไม่จำเป็นต้องวนซ้ำคุณสามารถทำได้kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(โปรดสังเกตการปรับโครงสร้างอีกครั้งดูความคิดเห็นของฉันในคำตอบของ @ synthesizerpatel)
tripleee

11
@tripleee ไม่มีปัญหากับ downvote ของคุณ แต่คุณทำตระหนักว่า OQ เป็น"ผมต้องการที่จะฆ่ากระบวนการทั้งหมดที่ฉันได้รับโดย: PS aux grep | my_pattern"ซึ่งผมได้รับการยอมรับ dutyfully
Eugen Rieck

ฆ่าจะฆ่ากระบวนการทั้งหมดในครั้งเดียวคุณไม่จำเป็นต้องวนซ้ำ หากpsผลตอบแทนสามกระบวนการ 123, 234 และ 345 คุณสามารถkill 123 234 345เหมือนกับrmหรือcatหลาย ๆ อาร์กิวเมนต์ไฟล์
tripleee

@tripleee ฉันจะลบgrep
Eugen Rieck

for KILLPID in ps ขวาน | grep 'puma' | grep -v 'grep' | awk '{พิมพ์ $ 1;}' ; do kill -9 $KILLPID; doneจะลบ grep
Justin E

18

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อแสดงรายการกระบวนการ

ps aux | grep -c myProcessName 

หากคุณต้องการตรวจสอบจำนวนกระบวนการนั้นให้เรียกใช้

ps aux | grep -c myProcessName |grep -v grep 

หลังจากนั้นคุณสามารถฆ่ากระบวนการโดยใช้

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อแสดงรายการกระบวนการ ps aux | grep -c myProcessName หากคุณต้องการตรวจสอบจำนวนกระบวนการนั้นให้เรียกใช้ ps aux | grep -c myProcessName | grep -v grep หลังจากนั้นคุณสามารถฆ่ากระบวนการโดยใช้ kill -9 $ (ps aux | grep -e myProcessName | awk '{พิมพ์ $ 2}')
Nived Thanima

13

killall -r my_patternนอกจากนี้คุณสามารถใช้ -rตีความรูปแบบชื่อกระบวนการเป็นนิพจน์ทั่วไปที่ขยายเพิ่ม

killall -r my_pattern

8

หากคุณตัดสินpkill -f PATTERNว่าอันตรายเกินไปฉันเขียนezkillสคริปต์ทุบตีที่พร้อมท์ให้คุณเลือกว่ากระบวนการใดบ้างที่ตรงกับรูปแบบที่คุณต้องการฆ่า



4

หากคุณไม่ต้องการปวดหัวในการค้นหา id กระบวนการใช้ regexp เพื่อฆ่ากระบวนการตามชื่อ ตัวอย่างเช่นในการฆ่า chrome รหัสต่อไปนี้จะทำการหลอกลวง

killall -r --regexp chrome


1
คุณต้องการอย่างใดอย่างหนึ่ง-r หรือ --regexpซึ่งเป็นตัวเลือกสั้นและยาว GNU ตามลำดับ
BigSmoke

3

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อ:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

หรือ

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

มันใช้งานได้สำหรับฉัน


1
ยินดีต้อนรับสู่ StackOverflow โปรดใช้การเว้นวรรคหรือแท็บ 4 ช่องสำหรับบรรทัดโค้ดของคุณเพื่อให้มีการจัดรูปแบบเป็นบล็อคโค้ด ขอแสดงความนับถือ
YakovL


2

พบวิธีที่ดีที่สุดสำหรับเซิร์ฟเวอร์ที่ไม่รองรับ pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

คุณไม่ต้องห่วง


1

มันเป็นเรื่องที่ดีที่สุดและปลอดภัยที่สุดในการใช้pgrep -fด้วยkillหรือเพียงแค่pkill -f, grepไอเอ็นจีps's ส่งออกสามารถไปผิด

ซึ่งแตกต่างจากการใช้ps | grepที่คุณต้องการกรองบรรทัด grep โดยการเพิ่ม| grep -vหรือใช้เทคนิคลวดลายpgrepเพียงแค่ไม่เลือกด้วยตัวเองโดยการออกแบบ

ยิ่งไปกว่านั้นหากรูปแบบของคุณปรากฏในps's UID/ USER, SDATE/ STARTหรือคอลัมน์อื่น ๆ คุณจะได้รับกระบวนการที่ไม่ต้องการในผลลัพธ์และฆ่าพวกเขาpgrep+ pkillไม่ต้องทนกับข้อบกพร่องนี้

นอกจากนี้ฉันยังพบว่าkillall -r/ -regexpไม่ทำงานกับนิพจน์ปกติของฉัน

pkill -f "^python3 path/to/my_script$"

man pkill


0

ฉันรับคำตอบของ Eugen Rieck และทำงานกับมัน รหัสของฉันเพิ่มสิ่งต่อไปนี้:

  1. ps ax รวม grep ดังนั้นฉันจึงยกเว้นด้วย grep -Eiv 'grep'
  2. เพิ่ม ifs และ echoes เล็กน้อยเพื่อให้อ่านได้โดยมนุษย์

ฉันได้สร้างไฟล์ตั้งชื่อkillserverที่นี่แล้วมันจะ:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

ผล

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

นี่คือวิธี:

kill -9 $(pgrep -d' ' -f chrome)

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