Bunuh banyak contoh dari proses yang berjalan dengan satu perintah
75
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?
Tidak jelas untuk sistem apa Anda bermaksud ini bekerja. Sebagai contoh, di Linux saya gunakan pkilldari procpspaket.
Deer Hunter
Pertanyaan itu ditanyakan dari sudut pandang umum. Saya tahu hanya dua proses seperti killall dan via awk / sed. Tetapi saya ingin tahu apakah ada cara lain untuk mencapai ini. Jika berbeda dilakukan dalam sistem yang berbeda, maka saya ingin tahu apa yang ada di dalamnya. Ini sangat merepotkan bagi google, sebagai gantinya saya berpikir untuk berdiskusi dengan kalian semua yang sudah berpengalaman.
The Dark Knight
Jawaban:
97
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.
Terpilih, hanya tahu variasi pertama. Yang kedua terlihat lebih efisien, terima kasih.
The Dark Knight
5
@TheDarkKnight Masalah dengan metode ini adalah Anda sering berakhir dengan membunuh lebih dari yang Anda inginkan. Menulis “pencarian” yang andal memang sulit. Di Linux, gunakan pkill , yang menangani sebagian besar kehalusan.
Gilles
Saya tidak yakin itu sesulit itu, jika Anda mencari biner tertentu, itu bisa sangat andal. Saya selalu menjalankannya sebagai yang 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.
EightBitTony
1
Kecuali mutlak diperlukan, Anda harus mengirim proses SIGTERM bukan SIGKILL.
Saya harus menambahkan bahwa 2 metode ini tidak akan berfungsi di semua shell, misalnya tidak akan berfungsicsh
non sequitor
38
Gunakan killall,
killall vi
Ini akan membunuh semua perintah bernama 'vi'
Anda juga dapat menambahkan sinyal, misalnya SIGKILL
Itu benar, Anda juga dapat menambahkan sinyal yang Anda inginkan, sepertikillall -9 vi
Hola Soy Edu Feliz Navidad
1
Saya tidak berpikir killall adalah naswer untuk itu: Membunuh dengan file hanya berfungsi untuk executable yang tetap terbuka selama eksekusi, yaitu executable yang tidak murni tidak dapat dibunuh dengan cara ini. Mengetik nama killall mungkin tidak memiliki efek yang diinginkan pada sistem non-Linux, terutama ketika dilakukan oleh pengguna istimewa. Bagaimana jika saya mencoba untuk menghapus banyak contoh dari beberapa proses non-linux? killall -w tidak mendeteksi jika suatu proses menghilang dan digantikan oleh proses baru dengan PID yang sama di antara pemindaian. Jika proses mengubah nama mereka, killall mungkin tidak dapat mencocokkannya dengan benar.
The Dark Knight
13
Perlu diketahui bahwa ini hanya berfungsi di Linux dan BSD. Pada Solaris dan beberapa sistem lainnya killallmelakukan persis seperti namanya ... itu membunuh proses init.
Bobby
2
Di AIX, itu "membatalkan semua proses yang Anda mulai, kecuali yang menghasilkan proses killall."
EightBitTony
31
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:
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.
Tidak tersedia di semua UNIX, dan tidak menyebutkan OS UNIX atau seperti UNIX tertentu dalam pertanyaan.
EightBitTony
@EightBitTony pkilltersedia di Linux, BSD dan Solaris - afaik. Jadi memiliki spread lebih besar dari killall.
Nils
Saya setuju, tetapi killall bahkan lebih bermasalah karena ada beberapa alat dengan nama yang sama, yang kelihatannya memiliki perilaku yang sangat berbeda. Saya juga tidak suka jawaban semua. pkill tidak ada di AIX atau HP-UX dan terlepas dari apa yang beberapa orang suka percaya, masih ada yang berbasis UNIX non-Linux di dunia.
EightBitTony
1
@EightBitTony itu sebabnya jawaban Anda diterima. Tapi saya tidak akan menggunakannya pada Solaris (yang juga Unix).
Nils
6
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:
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.
pkill
dariprocps
paket.Jawaban:
Apa yang salah dengan yang baik,
Ada cara untuk membuatnya lebih efisien,
dan variasi lainnya, tetapi pada tingkat dasar, selalu berhasil untuk saya.
sumber
echo kill -9 $pid
pertama, jadi saya tahu apa yang saya dapatkan. Saya tidak yakin AIX memilikinyapkill
, 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
sumber
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 substringvi
. Untuk membunuh hanya proses yang disebutvi
, gunakanpkill -x vi
. Untuk membunuh hanya proses yang dipanggilvi
dengan argumen terakhir yang diakhiri.conf
, gunakanpkill -fx 'vi.*\.conf'
.Untuk melihat daftar PID yang
pkill
akan mengirim sinyal, gunakanpgrep
, yang memiliki sintaks yang persis sama kecuali bahwa ia tidak menerima nama atau nomor sinyal. Untuk melihat informasi lebih lanjut tentang proses ini, jalankanDi Linux, Anda membutuhkannya
ps -p $(pgrep -d, …)
(itu bug: Linuxps
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
; gunakanfuser -k
untuk mengirim mereka sinyal. Misalnya,fuser -k /usr/bin/find
bunuh semua isntance yang berjalan darifind
.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, jalankankill -1234
ataukill -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 dengangrep
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:Ingat bahwa perintah Anda
grep
atauawk
dirinya sendiri mungkin tercantum dalamps
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 dalamps
output.sumber
pkill
sangat bagus di sini. Anda dapat memberikannya banyak parameter untuk memperbaiki pola.sumber
pkill
tersedia di Linux, BSD dan Solaris - afaik. Jadi memiliki spread lebih besar darikillall
.Cara termudah untuk dilakukan adalah memeriksa terlebih dahulu Anda mendapatkan ID proses yang benar dengan:
Jika hasilnya seperti yang diharapkan. Pergi dengan:
sumber
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 gunakankill -9 $(pidof <proc name>)
Kelemahan dari solusi ini adalah tidak memungkinkan untuk menggunakan ekspresi reguler.
sumber
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
sumber
ps -ef
kepkill
ataupgrep
? Perintah-perintah ini tidak membaca dari input standar.Anda dapat membunuh banyak proses berbeda dengan menggunakan perintah di bawah ini
Perhatikan bahwa ini akan membunuh proses yang cocok dengan pola di atas, berarti
process1abc
process2def
process3ghi
juga akan terbunuh.sumber
pgrep "name-of-application" | xargs kill -9
Cukup sederhana untuk diingat dan bekerja dengan baik untuk saya.
sumber
sumber
sumber