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?


3
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.


1
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

killall -9 vi


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:

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.


Terima kasih banyak, ini sangat mengagumkan. Apa yang Anda berikan adalah semacam tutorial. Terima kasih lagi . Dipilih
The Dark Knight

6

pkillsangat bagus di sini. Anda dapat memberikannya banyak parameter untuk memperbaiki pola.


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:

pkill -f [part_of_a_command]

atau gunakan:pgrep -f "command name"
Magne

3

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.


0

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


1
Apa tujuan menyalurkan output ps -efke pkillatau pgrep? Perintah-perintah ini tidak membaca dari input standar.
Kusalananda

0

Anda dapat membunuh banyak proses berbeda dengan menggunakan perintah di bawah ini

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

Perhatikan bahwa ini akan membunuh proses yang cocok dengan pola di atas, berarti process1abc process2def process3ghijuga akan terbunuh.


-1

pgrep "name-of-application" | xargs kill -9

Cukup sederhana untuk diingat dan bekerja dengan baik untuk saya.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.