ฉันต้องการฆ่ากระบวนการทั้งหมดที่ได้รับโดย:
ps aux | grep my_pattern
ทำอย่างไร?
สิ่งนี้ไม่ทำงาน:
pkill my_pattern
ฉันต้องการฆ่ากระบวนการทั้งหมดที่ได้รับโดย:
ps aux | grep my_pattern
ทำอย่างไร?
สิ่งนี้ไม่ทำงาน:
pkill my_pattern
คำตอบ:
ใช้pkill -f
ซึ่งตรงกับรูปแบบสำหรับส่วนใด ๆ ของบรรทัดคำสั่ง
pkill -f my_pattern
pkill
- ข้อผิดพลาดที่พบบ่อยที่สุดคือการสันนิษฐานว่ามีเพียงหนึ่งอินสแตนซ์ของไบนารีแต่ละตัวเท่านั้นที่สามารถมีอยู่ได้ทุกเวลา
killall -m my_pattern
เป็น
pgrep
ก่อนเพื่อตรวจสอบสิ่งที่คุณกำลังจะฆ่า คุณสามารถใช้pgrep -l
เพื่อดูชื่อกระบวนการหรือpgrep -a
ดูบรรทัดคำสั่งแบบเต็ม มันใช้ธงเช่นเดียวกับ pkill pgrep -fa my_pattern
ดังนั้นในกรณีนี้คุณสามารถใช้
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
รหัสนี้กำลังทำอะไรอยู่?
การps -ef
สร้างรายการของรหัสกระบวนการบนคอมพิวเตอร์ที่ผู้ใช้รายนี้มองเห็นได้ ไปป์ที่ grep ตัวกรองที่ลงสำหรับแถวที่ประกอบด้วยสตริงนั้น The grep -v grep
says ไม่ตรงกับกระบวนการของตัวเองที่ทำ grepping การพิมพ์ไปป์ awk บอกว่าแบ่งแถวบนตัวคั่นช่องว่างเริ่มต้นและตัวกรองไปยังคอลัมน์ที่สองซึ่งเป็นรหัสกระบวนการของเรา ไปป์ไลน์ xargs หมุนกระบวนการใหม่เพื่อส่ง pid ทั้งหมดของไปที่kill -9
พวกเขาทั้งหมด
รหัสข้างต้นไม่ดี, อันตราย, น่าเกลียดและแฮ็กด้วยเหตุผลหลายประการ
หากรหัสกำลังสิ้นสุดลงกำลังทำฐานข้อมูลใด ๆ หรือทำธุรกรรมที่ปลอดภัยด้วยสภาพความน่าจะเป็นที่มีการแข่งขันต่ำเศษเสี้ยวของเปอร์เซ็นต์ของเวลาส่วนอะตอมมิกของการทำธุรกรรมนั้นจะถูกทำลายทำให้เกิดพฤติกรรมที่ไม่ได้กำหนด kill -9 ไม่มีนักโทษ หากรหัสของคุณไวต่อสิ่งนี้ลองเปลี่ยนชิ้นxargs kill
ส่วนด้วยค่าสถานะการส่งที่ร้องขอการปิดระบบอย่างนุ่มนวลและหากคำขอนั้นถูกปฏิเสธสุดท้ายจะเปลี่ยนเป็นkill -9
มีความเป็นไปได้ที่ไม่เป็นศูนย์ที่คุณจะหยุดระบบปฏิบัติการโดยไม่ตั้งใจหรือก่อให้เกิดพฤติกรรมที่ไม่ได้กำหนดในกระบวนการที่ไม่เกี่ยวข้องซึ่งนำไปสู่ความไม่แน่นอนของระบบทั้งหมดเนื่องจากps -ef
รายการกระบวนการที่เป็นไปได้ทั้งหมดที่มีอยู่ ชื่อกระบวนการหรือว่าในช่วงเวลาระหว่างการอ่านและดำเนินการฆ่า -9 กระบวนการได้เปลี่ยนไปเป็นอย่างอื่นและตอนนี้คุณได้สิ้นสุดกระบวนการสุ่มบางอย่างที่คุณไม่ได้ตั้งใจ
แต่ถ้าคุณเข้าใจความเสี่ยงและการควบคุมสำหรับพวกเขาด้วยชื่อที่ไม่ซ้ำกันมากและคุณก็โอเคกับการทำธุรกรรมที่ลดลงเล็กน้อยหรือข้อมูลเสียหายเป็นครั้งคราวจากนั้น 99.9% ของเวลาที่คุณจะต้องทำ หากมีปัญหาให้รีบูทคอมพิวเตอร์ตรวจสอบให้แน่ใจว่าไม่มีการชนกันของกระบวนการ มันเป็นเพราะรหัสเช่นนี้ที่ทำให้สคริปต์สนับสนุนเทคโนโลยี: "คุณลองรีสตาร์ทเครื่องคอมพิวเตอร์ของคุณ" เป็น meme ระดับ 5
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
เพื่อให้ xargs ไม่เรียกใช้งานคำสั่งหากไม่ได้รับอาร์กิวเมนต์
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
หากไม่มีเครื่องหมายอัญประกาศกระบวนการโพรเซสของฉันเท่านั้นที่ถูกฆ่าในการเรียกใช้ครั้งแรก เรียกใช้อีกครั้งฆ่าส่วนที่เหลือ
-r
ตัวเลือกไม่มีอยู่ใน OS X ดังนั้นจึงดูเหมือนว่า
หากคุณต้องการความยืดหยุ่นมากขึ้นในการเลือกกระบวนการที่ใช้
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
คุณสามารถใช้ grep -e เป็นต้น
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(โปรดสังเกตการปรับโครงสร้างอีกครั้งดูความคิดเห็นของฉันในคำตอบของ @ synthesizerpatel)
ps
ผลตอบแทนสามกระบวนการ 123, 234 และ 345 คุณสามารถkill 123 234 345
เหมือนกับrm
หรือcat
หลาย ๆ อาร์กิวเมนต์ไฟล์
grep
for KILLPID in
ps ขวาน | grep 'puma' | grep -v 'grep' | awk '{พิมพ์ $ 1;}' ; do kill -9 $KILLPID; done
จะลบ grep
คุณสามารถใช้คำสั่งต่อไปนี้เพื่อแสดงรายการกระบวนการ
ps aux | grep -c myProcessName
หากคุณต้องการตรวจสอบจำนวนกระบวนการนั้นให้เรียกใช้
ps aux | grep -c myProcessName |grep -v grep
หลังจากนั้นคุณสามารถฆ่ากระบวนการโดยใช้
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
killall -r my_pattern
นอกจากนี้คุณสามารถใช้ -r
ตีความรูปแบบชื่อกระบวนการเป็นนิพจน์ทั่วไปที่ขยายเพิ่ม
killall -r my_pattern
หากคุณตัดสินpkill -f PATTERN
ว่าอันตรายเกินไปฉันเขียนezkillสคริปต์ทุบตีที่พร้อมท์ให้คุณเลือกว่ากระบวนการใดบ้างที่ตรงกับรูปแบบที่คุณต้องการฆ่า
คุณสามารถใช้คำสั่งต่อไปนี้เพื่อ
kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
หากคุณไม่ต้องการปวดหัวในการค้นหา id กระบวนการใช้ regexp เพื่อฆ่ากระบวนการตามชื่อ ตัวอย่างเช่นในการฆ่า chrome รหัสต่อไปนี้จะทำการหลอกลวง
killall -r --regexp chrome
-r
หรือ --regexp
ซึ่งเป็นตัวเลือกสั้นและยาว GNU ตามลำดับ
คุณสามารถใช้คำสั่งต่อไปนี้เพื่อ:
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
หรือ
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
มันใช้งานได้สำหรับฉัน
ฟังดูไม่ดี?
pkill `pidof myprocess`
ตัวอย่าง:
# kill all java processes
pkill `pidof java`
พบวิธีที่ดีที่สุดสำหรับเซิร์ฟเวอร์ที่ไม่รองรับ pkill
kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $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$"
ฉันรับคำตอบของ Eugen Rieck และทำงานกับมัน รหัสของฉันเพิ่มสิ่งต่อไปนี้:
ps ax
รวม grep ดังนั้นฉันจึงยกเว้นด้วย grep -Eiv 'grep'
ฉันได้สร้างไฟล์ตั้งชื่อ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
นี่คือวิธี:
kill -9 $(pgrep -d' ' -f chrome)
my_pattern
เพียงย่อยของชื่อหรือไม่ก็มีการใด ๆ อักขระ regex พิเศษหรือไม่?