Saya ingin membunuh semua proses yang saya dapatkan:
ps aux | grep my_pattern
Bagaimana cara melakukannya?
Ini tidak bekerja:
pkill my_pattern
Saya ingin membunuh semua proses yang saya dapatkan:
ps aux | grep my_pattern
Bagaimana cara melakukannya?
Ini tidak bekerja:
pkill my_pattern
Jawaban:
Gunakan pkill -f
, yang cocok dengan pola untuk bagian mana pun dari baris perintah
pkill -f my_pattern
pkill
- kesalahan yang paling umum adalah asumsi bahwa hanya satu instance dari setiap biner bisa ada pada waktu tertentu.
killall -m my_pattern
.
pgrep
dulu untuk memverifikasi apa yang akan Anda bunuh. Anda dapat menggunakan pgrep -l
untuk melihat nama proses atau pgrep -a
untuk melihat baris perintah penuh. Ia menggunakan flag yang sama dengan pkill. Jadi dalam hal ini Anda bisa menggunakan pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Apa yang dilakukan kode ini?
The ps -ef
menghasilkan daftar id proses di komputer yang terlihat oleh pengguna ini. Pipa grep menyaring yang turun untuk baris yang berisi string itu. The grep -v grep
mengatakan 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 -9
mengakhiri semuanya.
Kode di atas buruk, berbahaya, jelek dan diretas karena beberapa alasan.
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 kill
bagian dengan bendera yang ditransmisikan yang meminta dimatikan dengan anggun, dan hanya jika permintaan itu ditolak, gunakan pilihan terakhir untukkill -9
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 -ef
mendaftar 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.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
agar xargs tidak menjalankan perintah jika tidak ada argumen yang diberikan.
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.
-r
Opsi tidak ada pada OS X, jadi sepertinya.
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.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(perhatikan juga refactoring; lihat juga komentar saya pada jawaban @ synthesizerpatel).
ps
mengembalikan tiga proses 123, 234, dan 345, Anda bisa kill 123 234 345
seperti Anda bisa rm
atau cat
beberapa argumen file.
grep
for KILLPID in
ps kapak | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
akan menghapus grep
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 }')
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
-r
atau keduanya --regexp
, yang merupakan opsi pendek dan GNU, masing-masing.
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.
Terdengar buruk?
pkill `pidof myprocess`
contoh:
# kill all java processes
pkill `pidof java`
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.
yang terbaik dan paling aman untuk digunakan pgrep -f
dengan kill
, atau hanya pkill -f
, grep
ing ps
keluaran 's bisa salah.
Tidak seperti menggunakan ps | grep
dengan mana Anda perlu menyaring garis grep dengan menambahkan | grep -v
atau menggunakan trik pola, pgrep
tidak akan memilih sendiri dengan desain.
Selain itu, jika pola Anda muncul di kolom ps
's UID
/ USER
, SDATE
/ START
atau lainnya, Anda akan mendapatkan proses yang tidak diinginkan dalam output dan membunuh mereka, pgrep
+ pkill
jangan menderita dari cacat ini.
juga saya menemukan bahwa killall -r
/ -regexp
tidak bekerja dengan ekspresi reguler saya.
pkill -f "^python3 path/to/my_script$"
Saya mengambil jawaban Eugen Rieck dan bekerja dengannya. Kode saya menambahkan yang berikut:
ps ax
termasuk grep, jadi saya mengecualikannya dengan grep -Eiv 'grep'
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
my_pattern
hanya substring nama, atau apakah itu mengandung karakter khusus regex?