ค้นหาและฆ่ากระบวนการในหนึ่งบรรทัดโดยใช้ bash และ regex


648

ฉันมักจะต้องฆ่ากระบวนการระหว่างการเขียนโปรแกรม

วิธีที่ฉันทำตอนนี้คือ:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

ฉันจะแยก id กระบวนการโดยอัตโนมัติและฆ่าในบรรทัดเดียวกันได้อย่างไร

แบบนี้:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

3
เชื่อฉัน! : 'D คำตอบแรกที่คุณเลือกนั้นซับซ้อนกว่าคำตอบที่คุณบอกในคำตอบของคุณ ฉันอยากจะเลือกวิธีของคุณ
Santosh Kumar

วิธีที่ดีที่สุดในการตรวจสอบว่ากระบวนการนั้นมีอยู่หรือไม่: stackoverflow.com/questions/3043978/…
เทรเวอร์บอยด์สมิ ธ

คำตอบ:


1398

ในbashคุณควรจะทำ:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

รายละเอียดเกี่ยวกับผลงานมีดังนี้

  • กระบวนการนี้psให้รายการกระบวนการทั้งหมดแก่คุณ
  • grepตัวกรองที่อยู่บนพื้นฐานของสตริงการค้นหาของคุณ[p]เป็นเคล็ดลับที่จะหยุดคุณยกขึ้นจริงgrepกระบวนการตัวเอง
  • awkเพียงช่วยให้คุณมีฟิลด์ที่สองของแต่ละบรรทัดซึ่งเป็น PID
  • การ$(x)สร้างหมายถึงการดำเนินการxแล้วเอาออกและวางไว้บนบรรทัดคำสั่ง ผลลัพธ์ของpsไปป์ไลน์ดังกล่าวภายในโครงสร้างที่สร้างไว้ด้านบนคือรายการรหัสกระบวนการดังนั้นคุณจึงต้องใช้คำสั่งเช่นkill 1234 1122 7654นั้น

นี่คือการถอดเสียงที่แสดงการทำงาน:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

และคุณสามารถเห็นมันยุติไม้หมอนทั้งหมด


อธิบายgrep '[p]ython csp_build.py'รายละเอียดเพิ่มเติมเล็กน้อย:

เมื่อคุณทำsleep 3600 &ตามps -ef | grep sleepนั้นคุณมักจะได้รับสองกระบวนการsleepในนั้นsleep 3600และgrep sleep(เพราะทั้งคู่มีsleepในนั้นนั่นไม่ใช่วิทยาศาสตร์จรวด)

แต่ps -ef | grep '[s]leep'จะไม่สร้างกระบวนการที่มีsleepอยู่ในนั้นมันแทนสร้างgrep '[s]leep'และนี่เป็นบิตหากินที่: grepไม่พบเพราะมันกำลังมองหาการแสดงออกปกติ "ตัวอักษรใด ๆ จากตัวอักษรชั้นเรียน[s](ซึ่งเป็นs) leepตามด้วย

กล่าวอีกนัยหนึ่งมันกำลังมองหาsleepแต่กระบวนการ grep นั้นgrep '[s]leep'ไม่มีsleepอยู่ในนั้น

เมื่อฉันแสดงสิ่งนี้ (โดยคนที่นี่บน SO) ฉันเริ่มใช้มันทันทีเพราะ

  • มันเป็นกระบวนการหนึ่งน้อยกว่าการเพิ่ม| grep -v grep; และ
  • มันหรูหราและส่อเสียดการรวมกันที่หายาก :-)

2
@paxdiablo คุณสามารถระบุลิงก์สำหรับสิ่งนั้นได้หรือไม่ ฉันงงงันว่าทำไมมันทำงาน
เกล็นแจ็

58
คุณสามารถใช้ awk - ps aux | เท่านั้น awk '/ [b] eam / {พิมพ์ $ 2}'ไม่จำเป็นต้องใช้grep
Yola

20
ดีกว่าที่จะใช้เฉพาะ pgrep หรือ pkill
NGix

2
มีปัญหาเล็ก ๆ น้อยหนึ่ง - หากกระบวนการได้ถูกยกเลิกไปแล้วบรรทัดของkillนี้จะปั่นออกพร้อมกับเอาท์พุทมาตรฐานkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
ไลโอเนลชาน

5
แทนที่จะคุณยังสามารถใช้:grep '[p]ython csp_build.py' ส่งคืนบรรทัดที่ไม่จับคู่ kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')grep -v
usandfriends

138

ถ้าคุณมี pkill

pkill -f csp_build.py

ถ้าคุณเพียงต้องการที่จะ grep กับชื่อกระบวนการ (แทนรายการอาร์กิวเมนต์เต็ม) -fแล้วปล่อยออก


1
ไม่มีอะไรเกิดขึ้นเมื่อฉันทดสอบสิ่งนี้
Orjanp

8
ใช้ pgrep ก่อนเพื่อตรวจสอบว่าคุณได้ทำกระบวนการที่ถูกต้อง จากนั้นใช้ pkill อีกครั้งในรูปแบบที่ถูกต้อง
ghostdog74

18
+1 pgrepและpkillทำงานตราบเท่าที่คุณระมัดระวังในการระบุกระบวนการอย่างถูกต้อง โดยค่าเริ่มต้นเฉพาะชื่อกระบวนการที่จับคู่ซึ่งเกือบจะเป็นเพียง "งูใหญ่" ในกรณีนี้ ใช้pgrep -f "python csp_build.py"เพื่อจับคู่คำสั่งแบบเต็ม
mr.spuratic

3
คุณอาจต้องบังคับให้ฆ่าด้วยpkill -9 -f csp_build.py
studgeek

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

89

หนึ่งในสายการบิน:

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

  • พิมพ์คอลัมน์ 2: awk '{print $2}'
  • sudo เป็นตัวเลือก
  • Run kill -9 5124, kill -9 5373ฯลฯ (ฆ่า -15 เป็นสง่างามมากขึ้น แต่ช้าลงเล็กน้อย)

โบนัส:

ฉันยังมี 2 ฟังก์ชั่นทางลัดที่กำหนดไว้ใน. bash_profile ของฉัน (~ / .bash_profile สำหรับ osx คุณต้องดูว่าอะไรเหมาะกับเครื่อง * nix ของคุณ)

  1. คำหลักp
    • แสดงรายการกระบวนการPทั้งหมดที่มีคำหลัก
    • การใช้งานเช่น: p csp_build, p pythonฯลฯ

รหัส bash_profile:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. คำหลักka
    • Kเจ็บป่วยกระบวนการ LL ที่มีคำหลักนี้
    • การใช้งานเช่น: ka csp_build, ka pythonฯลฯ
    • ระดับการฆ่าแบบเลือกได้เช่น: ka csp_build 15,ka python 9

รหัส bash_profile:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

คำเตือน - อย่าลืมรีสตาร์ท bash shell (เทอร์มินัล) เพื่อโหลดฟังก์ชั่นใหม่ หรือเรียกใช้source ~/.bash_profileในเชลล์ปัจจุบันเพื่อนำเข้าฟังก์ชั่นใหม่ (นี่คือสิ่งที่ฉันต้องการ)
a20

เช่นเดียวกับหลายคำตอบอื่น ๆ ที่นี่ได้รับความทุกข์นี้ monumentally จากการใช้งานที่ไร้ประโยชน์ grepโปรดจำไว้ว่าสิ่งที่ดูเหมือนgrep x | awk '{ y }'จะดีกว่าและแข็งแกร่งกว่าเดิมหากคุณแทนที่ด้วยawk '/x/ { y }'
tripleee

1
@tripleee เว็บไซต์ที่คุณเชื่อมโยงไปถึงเป็นของคุณใช่มั้ย ฉันสังเกตเห็นว่าคุณกำลังเชื่อมโยงมันในส่วนความคิดเห็นต่างๆ คุณพยายามสร้าง SEO หรือไม่?
a20

ไม่ฉันไม่มีความสนใจใน SEO ฉันหวังว่าจะสร้างความตระหนัก
tripleee

1
.. โดยเชื่อมโยงไปยังเว็บไซต์ของคุณราวกับว่ามันเป็นเว็บไซต์อำนาจ ดี นอกจากนี้grep ได้เร็วขึ้น
a20

16
killall -r regexp

-r, --regexp

ตีความรูปแบบชื่อกระบวนการเป็นนิพจน์ทั่วไปที่ขยายเพิ่ม


15

ลองใช้ดู

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

ต้องเปลี่ยนนิดหน่อย สิ่งนี้ใช้ได้ผล ขอบคุณ :) ps aux | grep 'python csp_build.py' | หัว -1 | ตัด -d "" -f 5 | xargs kill
Orjanp

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs killทำงานให้ฉัน thanx
Rasika Perera

โปรดจำไว้ว่าเด็ก ๆ Awk สามารถทำทุกอย่างได้grepและส่วนใหญ่จะเรียบง่ายและสวยงาม กรณีเล็ก ๆ น้อย ๆ ของการgrep x y | awk '{ z }'เขียนดีกว่าเสมอawk '/x/ { z }' y- ดูการใช้งานที่ไร้ประโยชน์grepเช่นกัน
tripleee

11

คุณสามารถใช้pkill '^python*'สำหรับกระบวนการฆ่า regex เท่านั้น

หากคุณต้องการที่จะเห็นสิ่งที่คุณจะฆ่าหรือค้นหาก่อนที่จะฆ่าเพียงแค่ใช้pgrep -l '^python*'ที่ -l เอาท์พุทยังชื่อของกระบวนการ หากคุณไม่ต้องการใช้ pkillให้ใช้เพียง:

pgrep '^python*' | xargs kill


8

ใช้ pgrep - มีให้ในหลายแพลตฟอร์ม:

kill -9 `pgrep -f cps_build`

pgrep -f จะส่งคืน PID ทั้งหมดด้วยความบังเอิญ "cps_build"


2
ถ้าคุณมีคุณยังจะมีpgrep pkillเช่นเคยไม่ใช้kill -9จนกว่าคุณจะรู้ว่าทำไมkill -15(ค่าเริ่มต้น) หรือkill -2จะไม่ทำงาน
tripleee

นี่ดูเหมือนจะเป็นการแปลความหมายที่แย่กว่าของคำตอบของ@ nathanaelซึ่งละเว้นการ misdirected -9และใช้ไวยากรณ์การทดแทนคำสั่งที่เหมาะสม โหวตขึ้นแทน แม้ว่าแน่นอนpkillคำตอบก็ยังดีกว่า
tripleee

@tripleee ในกรณีนี้ kill -9 เป็นสิ่งที่ฉันต้องการ - ยุติผู้กระทำผิดทั้งหมดด้วยอคติที่รุนแรง ยิ่งกว่านั้นฉันใช้ kill -9 มาหลายปีโดยไม่มีปัญหา ในความคิดของฉันมักจะมีค่ายของนักปราชญ์และค่ายของผู้รู้จริงที่ทำสิ่งต่าง ๆ และฉันก็เป็นของคนหลัง ๆ (ในเรื่องนี้)
a20

คุณพลาดส่วน "ถ้าคุณไม่ทราบว่าทำไม" ฉันทุกคนทำสิ่งต่าง ๆ เสร็จ แต่นี่เป็นหนึ่งในวิธีทั่วไปในการถ่ายภาพตัวเองด้วยการเดินเท้าจนกว่าคุณจะเข้าใจความ-9หมายที่แท้จริง
tripleee

@tripleee เฮ้ทริปเปิ้ลฉันเพิ่งพบว่าคุณถูกฆ่า -15 เป็นตัวเลือกที่ดีกว่าเพราะมันให้โอกาสแอพที่จะฆ่าตัวเองอย่างสง่างาม ฉันเปลี่ยนรหัสของฉันแล้ว: stackoverflow.com/a/30486159/163382
a20

7

นี่จะคืนค่า pid เท่านั้น

pgrep -f 'process_name'

ดังนั้นเพื่อฆ่ากระบวนการใด ๆ ในหนึ่งบรรทัด:

kill -9 $(pgrep -f 'process_name')

หรือถ้าคุณทราบชื่อที่แน่นอนของกระบวนการคุณสามารถลอง pidof:

kill -9 $(pidof 'process_name')

แต่ถ้าคุณไม่ทราบชื่อที่แน่นอนของกระบวนการpgrepจะดีกว่า

หากมีหลายกระบวนการที่ใช้ชื่อเดียวกันและคุณต้องการฆ่ากระบวนการแรกจากนั้น:

kill -9 $(pgrep -f 'process_name' | head -1)

นอกจากนี้หากคุณกังวลเกี่ยวกับความไวของตัวพิมพ์เล็กคุณสามารถเพิ่มตัวเลือก -i ได้เช่นเดียวกับ grep ตัวอย่างเช่น:

kill -9 $(pgrep -fi chrome)

ข้อมูลเพิ่มเติมเกี่ยวกับสัญญาณและ pgrep ที่man 7 signalหรือman signalและman pgrep


5

คุณสามารถทำได้ด้วย awk และ backtics

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$ 2 ใน awk พิมพ์คอลัมน์ 2 และ backtics จะรันคำสั่งที่พิมพ์

แต่วิธีแก้ปัญหาที่สะอาดกว่านั้นก็คือกระบวนการของไพ ธ อนในการจัดเก็บเป็นรหัสกระบวนการใน / var / run จากนั้นคุณสามารถอ่านไฟล์นั้นและทำลายมันได้


คุณจะไม่ฆ่าทั้งกระบวนการ 5124 และ 5373 หรือ? ฉันเดาว่านี่ไม่ใช่ปัญหา
Orjanp

มันไม่ควรเป็นปัญหา แต่คุณสามารถเพิ่ม grep ตัวอื่นเพื่อแยกกระบวนการ grep: "grep -v grep" ระหว่าง grep และ awk
Alexander Kjäll

ทดสอบด้วยคำสั่งที่แก้ไขเล็กน้อย แต่มันไม่ได้ฆ่ากระบวนการเพียงพิมพ์ kill <pid> ps auxf | grep '[p] ython csp_build.py' | awk '{พิมพ์ "kill" $ 2}'
Orjanp

จำเป็นต้องแลกเปลี่ยนคำสั่ง "kill" $ 2 พิมพ์ด้วยระบบ ("kill" $ 2) จากนั้นก็ใช้งานได้ :)
Orjanp

5

งานของฉันถูกฆ่าทุกสิ่งที่ตรงกับ regexp ที่วางไว้ในไดเรกทอรีเฉพาะ (หลังจากการทดสอบซีลีเนียมไม่ใช่ทุกอย่างหยุด) สิ่งนี้ใช้ได้กับฉัน:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

-9ตัวเลือกในการkillอาจจะก้าวร้าวเกินไป มันไม่ปล่อยให้พวกเขาปลดปล่อยทรัพยากรของพวกเขา
Birei

ดี! คนเดียวที่พิจารณาข้อเท็จจริงที่ว่าอาจมีกระบวนการจับคู่มากกว่าหนึ่งกระบวนการ! หมายเหตุเล็กน้อยหนึ่ง: บางทีคุณอาจต้องการเพิ่ม "grep -v grep" หรืออะไรทำนองนั้นลงในไปป์เพื่อให้แน่ใจว่ากระบวนการ grep ไม่แสดงในรายการกระบวนการของคุณ
Brad Parks

killยอมรับกระบวนการหลายอย่างดังนั้นการวนซ้ำนั้นก็ไร้ประโยชน์ และดังที่กล่าวไว้ที่อื่นในหน้านี้คุณไม่ควรใช้kill -9เว้นแต่คุณจะรู้ว่ากระบวนการไม่ตอบสนองเพียงแค่killนี้
tripleee

เอา -9 ออกไม่ใช่เรื่องใหญ่ทำไม downvote คุณควรแก้ไขคำตอบให้ดีขึ้น
Serge

5

หากต้องการฆ่ากระบวนการด้วยคำหลักmidoriตัวอย่างเช่น:

kill -SIGTERM $(pgrep -i midori)


3

วิธีการใช้เท่านั้นawk(และps):

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

โดยใช้การทดสอบความเท่าเทียมกันของสตริงฉันป้องกันการจับคู่กระบวนการนี้เอง


ด้วยเหตุผลบางอย่างฉันไม่ได้รับผลกระทบจาก "python csp_build.py" แต่ "งูใหญ่" คนเดียวฮิต
Orjanp

3
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

ไม่สามารถ +1 ได้เนื่องจากขีด จำกัด รายวัน แต่การใช้psกับ-oตัวเลือกมีค่าใช้
P Shved

ps ไม่ได้ให้อะไรมากมาย [~] $ ps PID TTY TIME CMD 6365 pts / 6 00:00:00 ps 29112 pts / 6 00:00:00 bash
Orjanp

3

ให้ -f กับ pkill

pkill -f /usr/local/bin/fritzcap.py

เส้นทางที่แน่นอนของไฟล์. py คือ

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m


1

ฆ่ากระบวนการของเราเองที่เริ่มต้นจากPPIDทั่วไปค่อนข้างบ่อยpkill ที่เกี่ยวข้องกับการ–Pตั้งค่าสถานะเป็นผู้ชนะสำหรับฉัน ใช้ตัวอย่าง @ ghostdog74:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

1

คุณไม่จำเป็นต้องสลับผู้ใช้สำหรับ ps

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

1

ในบางกรณีฉันต้องการกระบวนการฆ่าแบบเสมือนจริงด้วยวิธีนี้:

sleep ~ นอน 1,000 และ
[1] 25410
sleep ~ นอน 1,000 และ
[2] 25415
sleep ~ นอน 1,000 และ
[3] 25421
id ~ pidof นอนหลับ
25421 25415 25410
➜ ~ ฆ่า `pidof sleep '
[2] - 25415 สิ้นสุดการนอนหลับ 1,000                                                             
[1] - 25410 จบการนอนหลับ 1000
[3] + 25421 ยุติการนอนหลับ 1,000

แต่ฉันคิดว่ามันไม่เหมาะสมในกรณีของคุณเล็กน้อย (อาจมีการเรียกใช้ python a, python b, python x ... ในพื้นหลัง)


1

หากpkill -f csp_build.pyไม่ฆ่ากระบวนการคุณสามารถเพิ่ม-9เพื่อส่งสัญญาณการฆ่าซึ่งจะไม่ถูกเพิกเฉย กล่าวคือpkill -9 -f csp_build.py


1

โซลูชันจะกรองกระบวนการด้วยรูปแบบที่แน่นอนแยกวิเคราะห์ pid และสร้างรายการอาร์กิวเมนต์สำหรับการดำเนินการกระบวนการ kill:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

คำอธิบายจาก documenation:

ยูทิลิตี้psแสดงบรรทัดส่วนหัวตามด้วยบรรทัดที่มีข้อมูลเกี่ยวกับกระบวนการทั้งหมดของคุณที่มีการควบคุมเทอร์มินัล

-eแสดงข้อมูลเกี่ยวกับกระบวนการของผู้ใช้รายอื่นรวมถึงกระบวนการนั้น

-fแสดง uid, pid, parent pid, การใช้งาน CPU ล่าสุด, กระบวนการเริ่มต้น

grepค้นหายูทิลิตี้ให้ใส่ไฟล์ใด ๆ การเลือกเส้นที่

รูปแบบ-e , - regexp = pattern ระบุรูปแบบที่ใช้ในระหว่างการค้นหาอินพุต: บรรทัดอินพุตถูกเลือกหากตรงกับรูปแบบใด ๆ ที่ระบุ ตัวเลือกนี้มีประโยชน์มากที่สุดเมื่อใช้ตัวเลือก -e หลายตัวเพื่อระบุหลายรูปแบบหรือเมื่อรูปแบบขึ้นต้นด้วยเส้นประ (`- ')

xargs - สร้างรายการอาร์กิวเมนต์และเรียกใช้อรรถประโยชน์

ฆ่า - ยุติหรือส่งสัญญาณกระบวนการ

สัญญาณหมายเลข9 - KILL (ฆ่าไม่จับ, ฆ่าไม่ติด)

ตัวอย่าง :

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

ฉันใช้สิ่งนี้เพื่อฆ่า Firefox เมื่อสคริปต์ถูกกระแทกและ cpu ทุบตี :) แทนที่ 'Firefox' ด้วยแอพที่คุณต้องการจะตาย ฉันอยู่ในเปลือก Bash - OS X 10.9.3 ดาร์วิน

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


การแทนที่grep Firefox | awk 'NR == 1 { next } ...'ด้วยawk 'NR == 1 || $11 !~ /Firefox/ { next } ...'ไม่เพียง แต่บันทึกกระบวนการ แต่ยังปรับปรุงความแม่นยำ มันไม่ยากเลยที่จะกำจัดsort | uniqAwk ที่บริสุทธิ์ออกไป (ในขณะที่แน่นอนว่าuniq | sortผิด - มันจะพลาดการทำซ้ำที่ไม่ได้อยู่ติดกันและซ่อนข้อผิดพลาดโดยการเรียงลำดับผลลัพธ์ของuniq)
tripleee

0

ฉันใช้gkill processnameซึ่ง gkill เป็นสคริปต์ต่อไปนี้:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

หมายเหตุ: มันจะไม่ฆ่ากระบวนการที่มี "grep" ในบรรทัดคำสั่ง


1
เช่นเดียวกับที่มีอยู่มากมายสิ่งประดิษฐ์จามรีอื่น ๆ อีกมากมายสิ่งนี้เต็มไปด้วยการใช้งานที่ไร้ประโยชน์grepและ antipatterns เชลล์สคริปต์ทั่วไปอื่น ๆ
tripleee

-1

คำสั่งต่อไปนี้จะมีประโยชน์:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

เช่น., ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

หากกระบวนการยังคงติดอยู่ให้ใช้ส่วนขยาย "-9" เพื่อ hardkill ดังต่อไปนี้:

kill -9 $(ps -elf | grep top| awk {'print $4'})

หวังว่าจะช่วย ... !


-1

ค้นหาและฆ่ากระบวนการทั้งหมดในหนึ่งบรรทัดใน bash

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'- ให้รายการของรายละเอียดกระบวนการทำงาน (uname, pid, ฯลฯ ) ซึ่งตรงกับรูปแบบ รายการผลลัพธ์ประกอบด้วยgrepคำสั่งนี้ซึ่งค้นหาด้วย ตอนนี้สำหรับการฆ่าเราต้องเพิกเฉยgrepกระบวนการคำสั่งนี้
  • ps -ef | grep '<exec_name>' | grep -v 'grep'- การเพิ่ม grep ตัวอื่นด้วยการ-v 'grep'ลบกระบวนการ grep ปัจจุบัน
  • จากนั้นใช้awkรับรหัสกระบวนการเพียงอย่างเดียว
  • จากนั้นให้คำสั่งนี้อยู่ข้างใน$(...)และส่งผ่านไปยังkillคำสั่งเพื่อฆ่ากระบวนการทั้งหมด

-1

คุณสามารถใช้คำสั่งด้านล่างเพื่อแสดงรายการ pid ของคำสั่ง ใช้ top หรือดีกว่าใช้ htop เพื่อดูกระบวนการทั้งหมดใน linux ที่นี่ฉันต้องการฆ่ากระบวนการที่มีชื่อว่า

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

และตรวจสอบ pid จะต้องมีความเหมาะสมในการฆ่าพวกเขาใช้คำสั่งฆ่า

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

เช่น: - มาจากรายการกระบวนการ htop

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

วิธีนี้ช่วยแก้ไขปัญหาของฉัน พร้อมเสมอที่จะเริ่มกระบวนการใหม่หากคุณฆ่ากระบวนการโดยไม่ตั้งใจ

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