Linux: ฆ่ากระบวนการตามอาร์กิวเมนต์


54

ฉันจะฆ่ากระบวนการตามอาร์กิวเมนต์บรรทัดคำสั่งได้อย่างไร killall, pgrepและpkillดูเหมือนว่าจะใช้งานได้ตามชื่อกระบวนการเท่านั้น

ฉันต้องการสิ่งนี้เพื่อให้สามารถแยกแยะความแตกต่างระหว่างจำนวนของแอปพลิเคชันที่ทำงานภายใน Java virtual machine ซึ่งjavaเป็นชื่อกระบวนการสำหรับพวกเขาทั้งหมดและชื่อแอปพลิเคชันที่แท้จริงสามารถพบได้โดยดูที่อาร์กิวเมนต์บรรทัดคำสั่ง

สิ่งนี้สามารถทำได้ด้วยตัวเองps aux | grep myapp.jarแล้วฆ่า pid จากเอาต์พุตด้วยตนเอง แต่ฉันต้องการให้คำสั่งทำสิ่งที่เทียบเท่าโดยอัตโนมัติ

คำตอบ:


69

pgrep/ pkillรับ-fธง จากmanหน้า:

-f    The pattern is normally only matched against the process name.
      When -f is set, the full command line is used.

ตัวอย่างเช่น:

$ sleep 30& sleep 60&
[1] 8007
[2] 8008

$ pkill -f 'sleep 30'
[1]  - terminated  sleep 30

$ pgrep sleep
8008

+1 แต่ทุบตีของฉัน4.1.5ไม่ได้ทำงานกับโคลอนหลังจากเครื่องหมายและ (ในบรรทัดแรกของตัวอย่าง) ... bash: syntax error near unexpected token ';'... มันทำงานในคำสั่งcaseเมื่อตามด้วยเครื่องหมาย ampersand ;;... อาจ คุณกำลังใช้เปลือกที่แตกต่างกัน (?)
Peter.O

@ jw013 ฉันใช้จริงzshซึ่งรองรับไวยากรณ์ที่ฉันใช้ แม้ว่าจะปล่อยให้มันใช้งานได้ทั้งสองอย่างดังนั้นฉันจึงลบมันออก
Michael Mrozek

@MichaelMrozek ok nvm แล้ว :) ฉันสงสัยว่า unix.SE มีสัดส่วนzshผู้ใช้ที่สูงกว่าที่อื่น - ฉันดูเหมือนจะพบzshผู้ใช้ที่นี่เท่านั้น
jw013

4

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


4

แทนที่argumentด้านล่างด้วยนิพจน์ทั่วไปที่ต้องใช้บรรทัดคำสั่งแบบเต็มของกระบวนการ:

kill `ps -eo pid,args --cols=10000 | awk '/argument/ && $1 != PROCINFO["pid"] { print $1 }'`

0

หากคุณไม่มี pkill หรืออะไรก็ตามเพียงใช้ proc / [1-9] * / cmdline

grep -a myapp.jar /proc/[1-9]*/cmdline|tr '\0' ' '|grep -v grep|awk -F/ '{print $3}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.