ฉันต้องการฆ่ากระบวนการทั้งหมดที่ได้รับโดย:
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 grepsays ไม่ตรงกับกระบวนการของตัวเองที่ทำ 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 พิเศษหรือไม่?