ใน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
; และ
- มันหรูหราและส่อเสียดการรวมกันที่หายาก :-)