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.
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.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r 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.
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
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.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9agar 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.
-rOpsi 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).
psmengembalikan tiga proses 123, 234, dan 345, Anda bisa kill 123 234 345seperti Anda bisa rmatau catbeberapa argumen file.
grep
for KILLPID in ps kapak | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneakan 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 -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$"
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_patternhanya substring nama, atau apakah itu mengandung karakter khusus regex?