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 $pidpertama, 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
killallmelakukan persis seperti namanya ... itu membunuh proses init.
pkilladalah 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 vibunuh 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 videngan argumen terakhir yang diakhiri .conf, gunakan pkill -fx 'vi.*\.conf'.
Untuk melihat daftar PID yang pkillakan 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 pstidak 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 -kuntuk mengirim mereka sinyal. Misalnya, fuser -k /usr/bin/findbunuh 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 -1234atau kill -HUP -1234atau sinyal lainnya.
Jika Anda tidak dapat menemukan cara yang lebih baik, gunakan psdengan opsi yang tepat untuk mendaftar semua proses dan memfilternya dengan grepatau 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 grepatau awkdirinya sendiri mungkin tercantum dalam psoutput ( psdan perintah penyaringan dimulai secara paralel, jadi apakah itu akan muncul atau tidak tergantung pada waktu). Ini sangat penting jika argumen perintah termasuk dalam psoutput.
pkillsangat bagus di sini. Anda dapat memberikannya banyak parameter untuk memperbaiki pola.
pkilltersedia 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 killtanpa 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 -efke pkillatau 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
pkilldariprocpspaket.