Bagaimana cara membunuh semua proses dengan nama yang diberikan?

16

Saya menjalankan perintah ps -A | grep <application_name>dan mendapatkan daftar proses seperti ini:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Saya ingin membunuh semua proses dari daftar: 19440, 21630, 22694.

Saya sudah mencoba ps -A | grep <application_name> | xargs kill -9 $1tetapi berfungsi dengan kesalahan.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Bagaimana saya bisa melakukan ini dengan anggun?

Łukasz D. Tulikowski
sumber

Jawaban:

25
pkill -f <application_na>

Akan membunuh semua proses yang mengandung pola <application_na>dalam nama mereka.

man pkill

Katu
sumber
9

Masalahnya adalah bahwa ps -A | grep <application_name> | xargs -n1mengembalikan output seperti ini

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Anda dapat menggunakan awkuntuk mendapatkan pertama kolom psoutput .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Akan mengembalikan daftar PID

19440
21630
22694

Dan menambahkan kill -9 $1Anda memiliki perintah yang membunuh semua PID

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1
Łukasz D. Tulikowski
sumber
ini sempurna saya mengujinya pada skrip bash itu membunuh proseser segera tanpa kesalahan + bahkan jika proses tidak dimulai tidak menunjukkan kesalahan yang saya inginkan, di sini contoh pembunuh prosesor ffmpeg nano /usr/bin/ffmpegk ,. . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F
Saya punya masalah dengan ini di mana saya mendapatkan output kill -9jika tidak ada proses yang cocok
Daniel F
1
Alih-alih grep, Anda harus menggunakan awkuntuk mencocokkan nama:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight
0

killall dapat melakukannya.

$ killall application_name
rudimeier
sumber
Apakah membunuh semua mengizinkan ekspresi reguler dalam nama aplikasi?
Łukasz D. Tulikowski
killall --regexp "appl.*me"Meskipun mungkin ada implementasi killall yang berbeda. Lihat man killall.
rudimeier
Killall tidak cukup kadang-kadang saya perlu mengirimnya tiga kali untuk mematikan proses, dan bahkan gagal untuk membunuhnya, satu-satunya solusi yang bekerja cepat untuk saya adalah kill -9 pidsaya pikir @ ŁukaszD.Tulikowski adalah solusi kerja terbaik khusus untuk skrip bash.
Salem F
-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh
Praveen Kumar BS
sumber
Meskipun saya belum memberikan suara untuk pertanyaan ini, Anda belum menjelaskan mengapa ini berbeda atau lebih baik daripada solusi lain - yang sangat mirip dengan ini - atau menjelaskan mengapa OP mengalami kesulitan dengan variasi mereka.
Jeff Schaller
-2

Pendekatan saya mirip dengan @ Łukasz D. Tulikowski. Alih-alih menggunakan grep <application_name>; Saya telah menggunakan grep "[a]pplication_name", yang tidak cocok dengan baris perintah prosesnya sendiri.

Ekspresi kurung siku adalah bagian dari greppencocokan pola kelas karakter. (Referensi) .


Anda dapat menggunakan awkuntuk mendapatkan pertama kolom psoutput.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Akan mengembalikan daftar PID

7644
407
406

Kemudian menambahkan kill -9 $1Anda memiliki perintah yang membunuh semua PID

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1
Alper
sumber
Mengapa grepalih - alih menggunakan awkuntuk melakukan tes lebih benar? grepakan mencocokkan nama yang menyertakan target sebagai substring, misalnya.
Toby Speight