Bagaimana cara membunuh semua proses yang cocok dengan nama?

260

Katakanlah saya ingin membunuh setiap proses yang mengandung kata amarok. Saya dapat mencetak perintah yang ingin saya jalankan. Tapi bagaimana caranya membuat shell mengeksekusinya. yaitu.

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031
PuercoPop
sumber
Tambahkan | sh -xsetelah sisa baris perintah Anda?
Jonathan Leffler
7
jangan pernah gunakan kill -9pada proses, lihat [manajemen proses] [1] [1]: mywiki.wooledge.org/… ...
Fredrik Pihl
Menambahkan ke komentar di atas bahwa tidak hanya membunuh -9 adalah ide yang buruk tetapi juga fakta bahwa Anda mencoba untuk membunuh banyak proses melalui nama mereka. Tidak ada yang unik tentang nama suatu proses dan karenanya merupakan kandidat yang buruk untuk identifikasi.
Raul-
Apakah itu akan membunuh amarokxproses juga? Saya pkill vi, itu membunuh supervisorctlyang mengandung `vi 'dalam kata.
Gank
4
Artikel tentang tidak menggunakan -9itu cukup tidak membantu - apakah ada informasi yang lebih baik tentang mengapa orang tidak boleh menggunakannya? Itu hanya mengatakan "jangan, dan pecat orang yang menggunakannya"; tetapi yang pernah saya lihat di tempat lain kill -9 {pid}adalah bagaimana cara membunuh sesuatu ...
dwanderson

Jawaban:

438

Dari man 1 pkill

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

Yang berarti, misalnya, jika kita melihat garis-garis ini di ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Kita dapat membunuh mereka semua menggunakan -fopsi pkill :

pkill -f httpd
Tim Bielawa
sumber
1
Saya menyadari ini tidak mendukung subjek pertanyaan ini, tetapi ini menunjukkan metode alternatif, dan lebih pendek, untuk melakukan apa yang Anda coba lakukan.
Tim Bielawa
19
Untuk kekuatan ekstra, tambahkan -9sampai akhir!
mlissner
Apakah itu akan membunuh httpdxproses juga? Saya pkill vi, itu membunuh supervisorctlyang mengandung `vi 'dalam kata.
Gank
Luar biasa - Ubuntu 18.04.1 LTS
Salathiel Genèse
Untuk pertandingan yang tidak sensitif huruf -i, gunakan pkill -fi wine. Untuk memverifikasi sebelum dan sesudah, gunakan ps uax | grep -i wine.
gagak vulcan
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - membuat daftar argumen dan menjalankan utilitas. Bermanfaat ketika Anda ingin memasukkan argumen ke sesuatu seperti killatau lsatau lebih.

Nektarios
sumber
3
Poin untuk menyebutkan xargs - semua hal pgrep / pkill ini semuanya sangat baik, tetapi xargs adalah alat tujuan umum, dan standar pada setiap linux / unix.
chrisdowney
4
"bunuh: Tidak ada proses seperti itu"
Cerin
3
Cerin itu karena sedang mencoba untuk membunuh proses grep juga, yang sudah selesai. Itu harus baik-baik saja.
Costi Muraru
6
Ada sedikit trik untuk menghindari menangkap proses grep: ps aux | grep -ie [a] marok | awk '{print $ 2}' | xargs kill -9
RCross
8
Anda juga dapat menambahkan panggilan grep lain untuk memfilter grep (menurut saya ini lebih mudah dibaca / diingat) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vsingkatan grep --invert)
driftcatcher
47

menggunakan pgrep

kill -9 $(pgrep amarok)
Eric Fortis
sumber
26
bahkan lebih elegan:pkill -9 amarok
glenn jackman
1
pkill menangani bagian "setiap proses yang mengandung kata <word>" secara asli tanpa membuat lebih banyak pipa atau proses. Lihat opsi -f untuk pencarian nama proses lengkap untuk menghilangkan kebutuhan akan pgrep.
Tim Bielawa
2
Hati-hati karena pkill secara default memungkinkan pencocokan sebagian pada nama proses. Perintah ini juga akan membunuh amarok2 jika ada. Gunakan -x atau -f jika Anda ingin menentukan nama yang tepat.
user79878
Ini akan gagal jika tidak cocok untuk pgrep
alfredocambera
untuk penggunaan nama lengkapkill -9 $(pgrep -f amarok)
cinatic
27

Cara aman untuk melakukan ini adalah:

pkill -f amarok
John Alexander Betts
sumber
1
Untuk menambah ini, saya menambahkan -lbendera. Aku sebenarnya hanya alias pkilluntuk pkill -fljadi saya dapat menjalankan sesuatu seperti pkill jbossdan itu akan meludahkan proses yang baru saja membunuh.
nland
Apakah itu akan membunuh amarokxproses juga? Saya pkill vi, itu membunuh supervisorctlyang mengandung `vi 'dalam kata.
Gank
Bagaimana ini berbeda dari jawaban atas (Tim)? Hanya cocok dengan nama contoh, jika tidak, terlihat sama? @ndland pkill: invalid option -- 'l'- pkill dari procps-ng 3.3.12
Xen2050
18

Saya pikir perintah killall ini persis apa yang Anda butuhkan. Perintah ini dideskripsikan sebagai "bunuh proses dengan nama". Mudah digunakan

killall chrome

Perintah ini akan mematikan semua proses Chrome. Berikut adalah tautan tentang perintah killall

http://linux.about.com/library/cmd/blcmdl1_killall.htm

Semoga perintah ini bisa membantu Anda.

androidyue
sumber
Ini hanya cocok dengan nama, bukan baris perintah penuh. Jelas tidak sama dengan mencari ps auxkeluaran
Xen2050
12

pkill -x sama persis dengan nama proses.

pkill -x amarok

pkill -f serupa tetapi memungkinkan pola ekspresi reguler.

Perhatikan bahwa pkill tanpa parameter lain (misalnya -x, -f) akan memungkinkan kecocokan sebagian pada nama proses. Jadi "pkill amarok" akan membunuh amarok, amarokBanana, bananaamarok, dll.

Saya berharap -x adalah perilaku default!

pengguna79878
sumber
Apakah itu akan membunuh amarokxproses juga? Saya pkill vi, itu membunuh supervisorctlyang mengandung `vi 'dalam kata.
Gank
@ Terima kasih, ya, nama proses dengan "amarok" di suatu tempat.
user79878
Bagaimana cara membunuh amarok bukan amarokx?
Gank
1
@ Gank, -x flag. pkill -x amarok
user79878
4

Jika Anda ingin mengeksekusi output dari sebuah perintah, Anda dapat memasukkannya ke dalam $(...), namun untuk tugas spesifik Anda lihatlah pada killalldan pkillperintah.

Chen Levy
sumber
3

Anda juga dapat mengevaluasi output Anda sebagai sub-proses, dengan mengelilingi semuanya dengan kutu belakang atau dengan memasukkannya ke dalam $ ():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     
dandrews
sumber
3

coba kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Untuk membunuh proses 11 November atau kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Untuk membunuh proses yang mengandung kata amarok

Victor Marrerp
sumber
0

Mungkin menambahkan perintah ke file yang dapat dieksekusi, mengatur + x izin dan kemudian mengeksekusi?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk
vova7865
sumber
-1

Jika Anda menggunakan cygwin atau shell minimal yang kurang killall Anda dapat menggunakan skrip ini:

killall.sh - Bunuh dengan nama proses.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Pemakaian:

$ killall <process name>
Tony O'Hagan
sumber
Saya mendapatkankill: invalid argument f
rosstex
1
Coba ganti -f dengan -
Tony O'Hagan