Linux: Matikan proses berdasarkan argumen

55

Bagaimana saya bisa membunuh proses berdasarkan argumen baris perintahnya? killall,, pgrepdan pkilltampaknya hanya berfungsi berdasarkan nama proses.

Saya perlu ini untuk dapat membedakan antara sejumlah aplikasi yang berjalan di dalam mesin virtual Java, di mana javanama proses untuk semua dari mereka dan nama aplikasi yang sebenarnya dapat ditemukan dengan melihat argumen command line.

Ini dapat dilakukan secara manual dengan ps aux | grep myapp.jardan kemudian secara manual membunuh pid dari output, tetapi saya ingin perintah untuk melakukan sesuatu yang setara secara otomatis.

Mark Howard
sumber

Jawaban:

70

pgrepSaya pkillmengambil -fbendera. Dari manhalaman:

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

Sebagai contoh:

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

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

$ pgrep sleep
8008
Michael Mrozek
sumber
+1, tetapi bash 4.1.5 saya tidak berfungsi untuk titik dua setelah tanda ampersand (seperti pada baris pertama contoh) ... bash: syntax error near unexpected token ';'... Itu berfungsi dalam pernyataan kasus ketika ampersand diikuti oleh ;;... mungkin Anda menggunakan shell yang berbeda (?)
Peter.O
@ jw013 sebenarnya saya gunakan zsh, yang mendukung sintaks yang saya gunakan. Membiarkannya berhasil di keduanya, jadi saya menghapusnya
Michael Mrozek
@MichaelMrozek ok nvm maka :) Saya ingin tahu apakah unix.SE memiliki proporsi zshpengguna yang lebih tinggi daripada di tempat lain - Saya sepertinya hanya menemukan zshpengguna di sini.
jw013
4

Anda dapat menggunakan htopuntuk melihat semua proses yang sedang berjalan dengan argumen baris perintah mereka dan untuk membunuh proses yang dipilih.

Jan Henke
sumber
4

Ganti di argumentbawah ini dengan ekspresi reguler yang harus banyak baris perintah penuh dari suatu proses:

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

Jika Anda tidak memiliki pkill atau apa pun, cukup gunakan proc / [1-9] * / cmdline

grep -a myapp.jar /proc/[1-9]*/cmdline|tr '\0' ' '|grep -v grep|awk -F/ '{print $3}'
ikrabbe
sumber