Misalkan saya memiliki seribu atau lebih contoh proses apa pun (misalnya, vi
) berjalan. Bagaimana cara membunuh mereka semua dalam satu tembakan / satu perintah baris / satu perintah?
Misalkan saya memiliki seribu atau lebih contoh proses apa pun (misalnya, vi
) berjalan. Bagaimana cara membunuh mereka semua dalam satu tembakan / satu perintah baris / satu perintah?
Jawaban:
Apa yang salah dengan yang baik,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Ada cara untuk membuatnya lebih efisien,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
dan variasi lainnya, tetapi pada tingkat dasar, selalu berhasil untuk saya.
echo kill -9 $pid
pertama, jadi saya tahu apa yang saya dapatkan. Saya tidak yakin AIX memilikinya pkill
, yaitu roti dan mentega saya UNIX. Dan apakah benar-benar cukup buruk untuk dipilih - aneh.
csh
Gunakan killall,
killall vi
Ini akan membunuh semua perintah bernama 'vi'
Anda juga dapat menambahkan sinyal, misalnya SIGKILL
killall -9 vi
killall -9 vi
killall
melakukan persis seperti namanya ... itu membunuh proses init.
pkill
adalah apa yang saya rekomendasikan, jika tersedia ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Anda dapat menentukan proses dengan nama perintah, dengan baris perintah penuh atau kriteria lainnya. Misalnya, pkill vi
bunuh semua program yang nama perintahnya mengandung substring vi
. Untuk membunuh hanya proses yang disebut vi
, gunakan pkill -x vi
. Untuk membunuh hanya proses yang dipanggil vi
dengan argumen terakhir yang diakhiri .conf
, gunakan pkill -fx 'vi.*\.conf'
.
Untuk melihat daftar PID yang pkill
akan mengirim sinyal, gunakan pgrep
, yang memiliki sintaks yang persis sama kecuali bahwa ia tidak menerima nama atau nomor sinyal. Untuk melihat informasi lebih lanjut tentang proses ini, jalankan
ps -p "$(pgrep …)"
Di Linux, Anda membutuhkannya ps -p $(pgrep -d, …)
(itu bug: Linux ps
tidak kompatibel dengan POSIX).
Cara umum lainnya untuk mengidentifikasi proses yang harus dimatikan adalah proses yang membuka file tertentu (yang dapat dieksekusi proses). Anda dapat mendaftar ini dengan fuser
; gunakan fuser -k
untuk mengirim mereka sinyal. Misalnya, fuser -k /usr/bin/find
bunuh semua isntance yang berjalan dari find
.
Jika ada proses pelarian yang terus-menerus bercabang, Anda mungkin perlu membunuh seluruh grup proses sekaligus. Grup proses diidentifikasi oleh negatif dari pemimpinnya, yang merupakan proses leluhur dari semua proses dalam grup. Untuk melihat grup proses dari suatu proses, jalankan ps -o pgid
(ditambah opsi apa pun untuk memilih proses yang akan ditampilkan). Jika Anda menentukan bahwa Anda ingin membunuh ketua grup proses 1234 dan semua anak-anaknya, jalankan kill -1234
atau kill -HUP -1234
atau sinyal lainnya.
Jika Anda tidak dapat menemukan cara yang lebih baik, gunakan ps
dengan opsi yang tepat untuk mendaftar semua proses dan memfilternya dengan grep
atau perintah pemfilteran teks lainnya. Berhati-hatilah agar tidak secara tidak sengaja mencocokkan proses lain yang kebetulan menjalankan perintah dengan nama yang sama, atau dengan argumen yang berisi nama itu. Sebagai contoh:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Ingat bahwa perintah Anda grep
atau awk
dirinya sendiri mungkin tercantum dalam ps
output ( ps
dan perintah penyaringan dimulai secara paralel, jadi apakah itu akan muncul atau tidak tergantung pada waktu). Ini sangat penting jika argumen perintah termasuk dalam ps
output.
pkill
sangat bagus di sini. Anda dapat memberikannya banyak parameter untuk memperbaiki pola.
pkill
tersedia di Linux, BSD dan Solaris - afaik. Jadi memiliki spread lebih besar dari killall
.
Cara termudah untuk dilakukan adalah memeriksa terlebih dahulu Anda mendapatkan ID proses yang benar dengan:
pgrep -f [part_of_a_command]
Jika hasilnya seperti yang diharapkan. Pergi dengan:
pkill -f [part_of_a_command]
pgrep -f "command name"
Menarik tidak ada yang menyebutkan yang ini. pidof menampilkan pids proses yang dipisahkan oleh ruang yang cocok dengan nama proses yang diteruskan. Dengan demikian, Anda dapat langsung menggunakan hasilnya kill
tanpa perpipaan. Di Arch Linux saya gunakan
kill -9 $(pidof <proc name>)
Kelemahan dari solusi ini adalah tidak memungkinkan untuk menggunakan ekspresi reguler.
Saya sarankan Anda untuk mencoba pkill
.
Ex: ps -ef | pkill -f command
Untuk memperlihatkan daftar semua proses yang akan dibunuh, pertama-tama cobalah untuk pgrep
:
Ex: ps -ef | pgrep -f command
ps -ef
ke pkill
atau pgrep
? Perintah-perintah ini tidak membaca dari input standar.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
dariprocps
paket.