Bagaimana cara membunuh semua proses dengan nama parsial yang diberikan? [Tutup]

623

Saya ingin membunuh semua proses yang saya dapatkan:

ps aux | grep my_pattern

Bagaimana cara melakukannya?

Ini tidak bekerja:

pkill my_pattern
Łukasz Lew
sumber
11
Apakah my_patternhanya substring nama, atau apakah itu mengandung karakter khusus regex?
Sven Marnach

Jawaban:

1318

Gunakan pkill -f, yang cocok dengan pola untuk bagian mana pun dari baris perintah

pkill -f my_pattern
Dor Shemer
sumber
7
@ Jay: itu juga cukup sembarangan dalam pembunuhannya. Sangat mudah untuk disalahgunakan ...
thkala
1
@ Jay: Anda tidak akan meyakinkan saya :-). Saya telah dibakar berkali-kali oleh skrip pihak ketiga yang bersikeras menggunakan pkill- kesalahan yang paling umum adalah asumsi bahwa hanya satu instance dari setiap biner bisa ada pada waktu tertentu.
thkala
4
Untuk setiap pengguna Mac yang menemukan jawaban ini, seperti yang saya lakukan, padanan Mac adalah killall -m my_pattern.
Zev Eisenberg
1
Jika Anda memiliki sejumlah proses gantung yang tidak terbunuh, gunakan pkill -f -9 untuk tanpa ampun membunuh mereka
MacK
18
Saya sarankan menggunakan pgrepdulu untuk memverifikasi apa yang akan Anda bunuh. Anda dapat menggunakan pgrep -luntuk melihat nama proses atau pgrep -auntuk melihat baris perintah penuh. Ia menggunakan flag yang sama dengan pkill. Jadi dalam hal ini Anda bisa menggunakan pgrep -fa my_pattern.
studgeek
158

Bunuh semua proses yang cocok dengan string "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Sumber: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Apa yang dilakukan kode ini?

The ps -efmenghasilkan daftar id proses di komputer yang terlihat oleh pengguna ini. Pipa grep menyaring yang turun untuk baris yang berisi string itu. The grep -v grepmengatakan tidak cocok pada proses itu sendiri melakukan grepping tersebut. Cetak awk pipa mengatakan pisahkan baris pada spasi putih pembatas default dan filter ke kolom kedua yang merupakan id proses kami. Xargs pipa memutar proses baru untuk mengirim semua pid, untuk kill -9mengakhiri semuanya.

Kode di atas buruk, berbahaya, jelek dan diretas karena beberapa alasan.

  1. Jika kode yang dipaksakan dihentikan adalah melakukan operasi basis data atau transaksi aman dengan kondisi ras probabilitas rendah, sebagian kecil dari persen waktu, atomitas dari transaksi itu akan hancur, menghasilkan perilaku yang tidak terdefinisi. membunuh -9 tidak membawa tahanan. Jika kode Anda peka terhadap hal ini, coba ganti xargs killbagian dengan bendera yang ditransmisikan yang meminta dimatikan dengan anggun, dan hanya jika permintaan itu ditolak, gunakan pilihan terakhir untukkill -9

  2. Ada kemungkinan tidak nol bahwa Anda akan secara tidak sengaja mengakhiri sistem operasi atau menyebabkan perilaku tidak terdefinisi dalam proses yang tidak terkait, yang mengarah ke seluruh ketidakstabilan sistem karena ps -efmendaftar setiap proses yang mungkin ada, dan Anda tidak dapat memastikan beberapa perpustakaan pihak ketiga yang aneh membagikan kepada Anda nama proses, atau pada waktu antara membaca dan menjalankan kill -9, processid telah berubah menjadi sesuatu yang lain, dan sekarang Anda secara tidak sengaja mengakhiri beberapa proses acak yang tidak Anda inginkan.

Tetapi, jika Anda memahami risiko dan kontrol untuk mereka dengan nama yang sangat unik, dan Anda setuju dengan beberapa transaksi yang dijatuhkan atau korupsi data yang sesekali, maka 99,9% dari waktu Anda akan baik-baik saja. Jika ada masalah, reboot komputer, pastikan tidak ada proses tabrakan. Itu karena kode seperti ini yang membuat skrip dukungan teknis: "Sudahkah Anda mencoba me-restart komputer Anda" meme level 5.

Eric Leschinski
sumber
15
Ini akan menimbulkan kesalahan jika tidak ada proses yang cocok dengan nama yang ditemukan. Anda mungkin ingin menggunakan ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9agar xargs tidak menjalankan perintah jika tidak ada argumen yang diberikan.
Epigene
2
Hanya sedikit modifikasi, mungkin lebih baik mengutip nama proses: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 Tanpa kutipan, hanya satu dari proses latar belakang saya yang terbunuh pada proses pertama. Menjalankannya lagi membunuh sisanya.
Ali Haider
-rOpsi tidak ada pada OS X, jadi sepertinya.
Danijel
52

Jika Anda membutuhkan lebih banyak fleksibilitas dalam memilih proses gunakan

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Anda dapat menggunakan grep -e dll.

Eugen Rieck
sumber
4
-1 Anda tidak perlu loop, Anda bisa kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(perhatikan juga refactoring; lihat juga komentar saya pada jawaban @ synthesizerpatel).
tripleee
11
@tripleee Tidak ada masalah dengan downvote Anda, tapi Anda lakukan menyadari, bahwa OQ adalah "Aku ingin membunuh semua proses yang saya dapatkan dengan: ps aux | grep my_pattern" , yang saya dutyfully diterima.
Eugen Rieck
Bunuh akan membunuh semua proses dalam sekali jalan, Anda tidak perlu lingkaran untuk itu. Jika psmengembalikan tiga proses 123, 234, dan 345, Anda bisa kill 123 234 345seperti Anda bisa rmatau catbeberapa argumen file.
tripleee
@ tripleee Saya ment menghapusgrep
Eugen Rieck
for KILLPID in ps kapak | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneakan menghapus grep
Justin E
18

Anda dapat menggunakan perintah berikut untuk mendaftar proses

ps aux | grep -c myProcessName 

jika Anda perlu memeriksa jumlah proses itu kemudian jalankan

ps aux | grep -c myProcessName |grep -v grep 

setelah itu Anda dapat mematikan proses menggunakan

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 
Nived Thanima
sumber
Anda dapat menggunakan perintah berikut untuk mendaftar proses ps aux | grep -c myProcessName jika Anda perlu memeriksa jumlah proses itu kemudian jalankan ps aux | grep -c myProcessName | grep -v grep setelah itu Anda dapat mematikan proses menggunakan kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima
13

Anda juga bisa menggunakannya killall -r my_pattern. -rMenafsirkan pola nama proses sebagai ekspresi reguler yang diperluas.

killall -r my_pattern
Alex
sumber
8

Jika Anda menilai pkill -f PATTERNagak terlalu berbahaya, saya menulis skrip bash ezkill yang meminta Anda untuk memilih proses mana di antara yang cocok dengan POLA yang ingin Anda bunuh.

kraymer
sumber
7

Anda dapat menggunakan perintah berikut untuk

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
Alex Liu
sumber
4

Jika Anda tidak ingin pusing menemukan proses id, gunakan regexp untuk mematikan proses dengan nama. Misalnya, untuk membunuh chrome kode berikut ini akan melakukan trik.

killall -r --regexp chrome

ajaz
sumber
1
Anda hanya perlu salah satu -r atau keduanya --regexp, yang merupakan opsi pendek dan GNU, masing-masing.
BigSmoke
3

Anda dapat menggunakan perintah berikut untuk:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

atau

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Ini bekerja untuk saya.

Luis Lopes
sumber
1
Selamat datang di StackOverflow. Silakan gunakan 4 spasi atau lekukan tab untuk baris kode Anda sehingga diformat sebagai blok kode. Best regards
YakovL
2

Terdengar buruk?

 pkill `pidof myprocess`

contoh:

# kill all java processes
pkill `pidof java`
pengguna6482587
sumber
2

Menemukan cara terbaik untuk melakukannya untuk server yang tidak mendukung pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

Anda tidak perlu mengulang.

Magige Daniel
sumber
1

yang terbaik dan paling aman untuk digunakan pgrep -fdengan kill, atau hanya pkill -f, greping pskeluaran 's bisa salah.

Tidak seperti menggunakan ps | grepdengan mana Anda perlu menyaring garis grep dengan menambahkan | grep -vatau menggunakan trik pola, pgreptidak akan memilih sendiri dengan desain.

Selain itu, jika pola Anda muncul di kolom ps's UID/ USER, SDATE/ STARTatau lainnya, Anda akan mendapatkan proses yang tidak diinginkan dalam output dan membunuh mereka, pgrep+ pkilljangan menderita dari cacat ini.

juga saya menemukan bahwa killall -r/ -regexp tidak bekerja dengan ekspresi reguler saya.

pkill -f "^python3 path/to/my_script$"

man pkill

Wis
sumber
0

Saya mengambil jawaban Eugen Rieck dan bekerja dengannya. Kode saya menambahkan yang berikut:

  1. ps ax termasuk grep, jadi saya mengecualikannya dengan grep -Eiv 'grep'
  2. Menambahkan beberapa jika dan gema agar dapat dibaca oleh manusia.

Saya telah membuat file, menamainya killserver, ini dia:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Hasil

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything
Meir Gabay
sumber
0

Begini caranya:

kill -9 $(pgrep -d' ' -f chrome)
MadMad666
sumber
3
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Igor F.