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?

Jawaban:


25
pkill -f <application_na>

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

man pkill


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

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

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

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

Mengapa grepalih - alih menggunakan awkuntuk melakukan tes lebih benar? grepakan mencocokkan nama yang menyertakan target sebagai substring, misalnya.
Toby Speight
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.