Apa perbedaan antara 'killall' dan 'pkill'?

92

Setelah menggunakan sekadar kill <some_pid>pada sistem Unix selama bertahun-tahun, saya belajar pkilldari yang lebih muda Linux-savvy rekan kerja rekan 1 .

Saya segera menerima cara Linux, pgrep-ing dan pkill-ing melalui banyak hari dan malam, melalui perlambatan dan kondisi balapan. Ini semua baik dan bagus.

Tapi sekarang aku tidak melihat apa pun kecuali killall. How-to sepertinya hanya menyebutkan killall, dan saya tidak yakin apakah ini semacam pengembangan paralel, atau apakah killallpenerusnya pkill, atau sesuatu yang lain.

Tampaknya berfungsi sebagai lebih bertarget pkill, tapi saya yakin saya kehilangan sesuatu.

Dapatkah Ubuntu / Debian-savvy 2 orang menjelaskan kapan (atau mengapa) killallharus digunakan, terutama jika itu harus digunakan dalam preferensi pkill(ketika pkillsering tampak lebih mudah, karena saya bisa lebih sembrono dengan pencocokan nama, setidaknya secara default).

Ketika berbicara tentang killall, saya tidak memikirkan perintah yang pada beberapa sistem Unix (Solaris, AIX,?) Akan membunuh semua proses pengguna. Berikut adalah deskripsi dari versi itu, dari halaman manual untuk AIX IBM :

Perintah killall membatalkan semua proses yang Anda mulai, kecuali yang menghasilkan proses killall. Perintah ini menyediakan cara yang mudah untuk membatalkan semua proses yang dibuat oleh shell yang Anda kontrol. Ketika dimulai oleh pengguna root, perintah killall membatalkan semua proses yang dapat dibatalkan kecuali proses yang memulai itu. Jika beberapa Sinyal ditentukan, hanya yang terakhir yang efektif.

1 'kolega' adalah peningkatan gratis dari 'rekan kerja', jadi mungkin juga.
2 Awalnya saya pikir ini adalah Linux atau Debian, tetapi beberapa sumber mengatakan bahwa Linux killallberasal dari Unix BSD.

belacqua
sumber

Jawaban:

68

Saya pikir Anda melihat killall di how-to karena secara default itu memerlukan nama proses yang tepat, sedangkan pkill melakukan pencocokan pola dasar. Dengan demikian, killall lebih aman bagi pengguna untuk menyalin dan menempel secara membabi buta.

Pkill dan killall keduanya memiliki opsi yang membedakan. Killall memiliki bendera yang cocok dengan usia proses, pkill memiliki bendera untuk hanya membunuh proses pada tty yang diberikan. Etcetera ad nauseum. Tidak ada yang lebih baik , mereka hanya memiliki spesialisasi yang berbeda.

Saya melihat dari halaman manual mereka bahwa killall berasal dari paket psmisc , yang memiliki beberapa utilitas untuk mengelola proses, tetapi terutama tidak mengandung ps. Ini adalah paket procps yang memiliki ps, top, kill, dan pkill (antara lain). Saya berani bertaruh para prokt tidak memiliki pkill, jadi psmisc menggaruk gatal dan muncul dengan killall.

The man page pkill / pgrep mengatakan mereka diperkenalkan pada Solaris 7. Seperti yang Anda sebutkan, jgbelacqua , killall Solaris adalah bukan psmisc utilitas menyediakan, sehingga Solaris mungkin hanya memiliki paket procps. Seseorang menginginkan alat proses pencocokan pola, sehingga pkill dan pgrep. Apakah itu dikembangkan oleh pengembang proc atau ditambahkan sesudahnya, saya tidak tahu. Apapun itu, ia berhasil masuk dan menjadi bagian dari * nixes di mana-mana.

Sumber lainnya:

djeikyb
sumber
1
Hmm - ada killallpada sistem Solaris (lama?), Tetapi berperilaku berbeda. Itu membunuh segalanya.
belacqua
6
@manish - eh, ada killall berbeda pada sistem SysV.
belacqua
1
@djeikyb Pikiran tentang killall menjadi lebih aman terdengar benar, atau setidaknya itu bisa menjelaskan banyak popularitasnya.
belacqua
5
@ Bahasa Spanyol: pkill (no kill) tidak perlu nomor pid, atau nama proses. Itu benar-benar cocok pada nama proses.
Javier Rivera
3
killall is safer for users to blindly copy and paste, kecuali jika Anda menggunakan mesin di mana killall benar-benar membunuh semua. Sangat disayangkan bahwa dua utilitas yang berbeda memiliki nama yang sama.
Lie Ryan
7

Harap berhati-hati dengan "killall". Pada beberapa sistem (saya lupa yang mana), killall membunuh semua proses. Ini akan diam-diam mengabaikan argumen dan membuat sistem Anda berhenti total.

phessler
sumber
5
Ini tidak benar. Killall tanpa argumen tidak akan melakukan apa pun, dan killall tidak akan mengabaikan argumen. kill -9 -1mungkin membunuh sistem Anda, dan killall -9 -1mungkin juga. Tetapi tidak hanyakillall [program]
Thomas Ward
6
Memang benar pada sistem SysV, seperti yang sekarang disebutkan dalam pertanyaan asli.
alanc
3

jika Anda mengaktifkan /etc/bash_completion, killall <part_of_process_name>tab setelah dan tekan - otomatis melengkapi nama proses dari daftar proses yang berjalan

jet
sumber
2
Pelengkapan otomatis yang sama akan dilakukan dengan pgrep / pkill. Sesuatu yang biasa saya lakukan adalah pkill plug<tab>mematikan plugin flash untuk firefox ketika saya tahu bahwa saya tidak memiliki apa pun yang ingin saya gunakan untuk sementara waktu tetapi masih ingin secara aktif menggunakan firefox. Ini adalah fungsi dari shell, bukan perbedaan antara killall dan pgrep / pkill.
Arcege
1
Saya tidak mengatakan perbedaan - hanya fitur yang bagus untuk menghindari mencari PID, nama proses dan lain
jet
2

Jika Anda melihat opsi pada kedua program, Anda akan melihat bahwa keduanya melakukan hal yang sama, tetapi dengan cara yang berbeda.

pkill akan melakukan pencocokan pada berbagai atribut suatu proses (CMD, PID, PPID, UID ...) dan akan mengirimkan sinyal yang diberikan ke setiap proses yang cocok. (Untuk CMD, ekspresi reguler digunakan, untuk yang lain itu adalah string). pkill tidak interaktif, tetapi lebih baik untuk program batch.

killall akan melakukan pencocokan pada nama proses (comm) atau pengguna (user), bukan pada keseluruhan string perintah. Argumen digunakan sebagai string sederhana dan harus cocok dengan seluruh nilai 'comm' (ada juga opsi --regexp untuk mengubah ini). killall memiliki opsi --interactive dan --younger-than, yang tidak dimiliki pkill.

Ada juga killall5 dari SysV days dan porting ke varian UNIX lainnya (konon di bawah paket Ubuntu 'sysutils'). Ini berperilaku berbeda dengan cara mode lama. Ini sering digunakan secara internal ke skrip init untuk mematikan atau mengubah ke mode pengguna tunggal.

Arcege
sumber
2
Tidak, tidak pkilljuga tidak killallboleh digunakan dalam skrip, hanya secara interaktif, dan dengan hati-hati.
geirha