'Killall' ve 'pkill' arasındaki fark nedir?


92

Sadece düz kullandıktan sonra kill <some_pid>uzun yıllar Unix sistemleri üzerinde, öğrendiğim pkillgenç Linux meraklısı gelen meslektaş meslektaşı 1 .

Yakında, Linux yönlü kabul pgrep-ing ve pkillyavaş çıkışlar ve yarış koşulları sayesinde, birçok gün ve gece boyunca -ing. Bunların hepsi iyi ve güzeldi.

Ama şimdi hiçbir şey göremiyorum ama killall. Nasıl yapılır sadece söz gibi gözüküyor killallve bunun bir çeşit paralel gelişme olup olmadığından, veya killallhalefi pkillveya başka bir şey olup olmadığından emin değilim .

Daha hedefli olarak işlev görüyor gibi görünüyor pkill, ancak bir şeyleri özlediğime eminim.

Bir Ubuntu / Debian-meraklı 2 kişi ne zaman (veya neden) killallkullanılması gerektiğini, özellikle tercih edildiğinde kullanılması gerektiğini açıklayabilir mi pkill( pkillçoğu zaman daha kolay gözüktüğü zaman , çünkü en azından varsayılan olarak isim eşleştirmeli olabilir).

Konuşurken, killallbazı Unix sistemlerinde (Solaris, AIX,?) Tüm kullanıcı işlemlerini öldüreceği komutunu düşünmüyorum. İşte IBM'in AIX'in bir sayfasından , bu sürümün açıklaması :

Killall komutu, killall işlemini üretenler hariç başlattığınız tüm işlemleri iptal eder. Bu komut, kontrol ettiğiniz kabuk tarafından oluşturulan tüm işlemleri iptal etmek için uygun bir yol sağlar. Bir kök kullanıcı tarafından başlatıldığında, killall komutu, onu başlatan işlemler dışındaki tüm iptal edilebilir işlemleri iptal eder. Birkaç Sinyal belirtilirse, sadece sonuncusu etkilidir.

1 'meslektaş', 'iş arkadaşından' ücretsiz yükseltmedir, öyle olabilir.
2 Aslen bunun bir Linux veya Debian olayı olduğunu düşündüm, ancak bazı kaynaklar Linux'un killallBSD aromalı Unix'ten geldiğini söylüyor .

Yanıtlar:


68

Bence killall'ı nasıl yapılır diye görüyorsunuz, çünkü varsayılan olarak kesin işlem adı gerektirir, oysaki pkill temel desen eşleştirmesini yapar. Bu nedenle, killall, kullanıcıların kör bir şekilde kopyalayıp yapıştırmaları için daha güvenlidir.

Pkill ve killall'ın ayırt edici seçenekleri var. Killall'ın süreç yaşına göre eşleştirmesi gereken bir bayrak var, pkill ise sadece verilen bir tty'deki süreçleri öldürecek bir bayrağa sahip. Etcetera reklam müzesi. Hiçbiri daha iyi değil , sadece farklı özelliklere sahipler.

Adam sayfalarından, öldürmenin , birkaç süreç yönetimi yardımcı programına sahip olan, ancak özellikle içermeyen psmisc paketinden geldiğini görüyorumps . Bu var PROCPS paket ps, top, öldürmek ve (diğerlerinin yanı sıra) pkill sahiptir. Bahislerimin başında pkill yokmuş gibi oynuyordum, bu yüzden psmisc kaşıntı çizdi ve öldürdü.

Pkill / pgrep adam sayfası size söz gibi onlar Solaris 7'de tanıtıldı diyor jgbelacqua , Solaris'in Killall değil yarar psmisc dolayısıyla Solaris muhtemelen sadece PROCPS paket vardı sağlar oldu. Birisi bir kalıp eşleştirme işlemi aracı istedi, böylece pkill ve pgrep. Procps dev tarafından geliştirilmiş veya daha sonra eklenmiş olsun, bilmiyorum. Ne olursa olsun, onu yarattı ve her yerde * nix'lerin bir parçası oldu.

Daha fazla kaynak:


1
Hmm - killallaçık (eski?) Bir Solaris sistemi vardı, ancak farklı davrandı. Her şeyi öldürdü.
belacqua

6
@ manish - er, SysV sistemlerinde farklı bir katliam yaşandı.
belacqua

1
@djeikyb Killall'ın daha güvenli olduğu düşüncesi doğru geliyor ya da en azından popülaritesinin çoğunu oluşturabilir.
belacqua

5
@Manish: pkill (öldürme yok), pid numarasına veya işlem adına ihtiyaç duymaz. İşlem adında pıtırtı eşleşmesi yapıyor.
Javier Rivera

3
killall is safer for users to blindly copy and pastedışında, Killall'ın gerçekten hepsini öldürdüğü bir makinedeyseniz. İki farklı yardımcı programın aynı ada sahip olması talihsizlik.
Yalan Ryan

7

Lütfen "killall" a dikkat edin. Bazı sistemlerde (hangisini unutacağımı unutuyorum), killall tüm işlemleri öldürür . Argümanları sessizce görmezden gelecek ve sisteminizi tamamen durduracak.


5
Bu doğru değil. argümanlar olmadan killall hiçbir şey yapmaz, ve killall argümanları görmezden gelmez. kill -9 -1sisteminizi öldürebilir ve killall -9 -1olabilir. Ama sadecekillall [program]
Thomas Ward

6
Orijinal soruda şimdi belirtildiği gibi SysV sistemlerinde geçerlidir.
alanc

3

Eğer / etc / bash_completion 'u etkinleştirirseniz, sonra killall <part_of_process_name>ve sekmeye bas - otomatik olarak çalışan isimler listesinden işlem ismini tamamlar.


2
Aynı otomatik tamamlama pgrep / pkill ile yapılacaktır. Yaygın olarak yaptığım bir pkill plug<tab>şey, bir süre kullanmak istediğim bir şey olmadığını ancak aktif olarak firefox'u kullanmak istediğimi bildiğimde firefox için flash eklentisini öldürmektir. Bu, kabuğun bir işlevidir, killall ve pgrep / pkill arasındaki fark değildir.
Arcege

1
Fark etmedim - PID'leri, işlem adlarını vb. Aramaktan kaçınmak için güzel bir özellik
jet

2

Her iki programdaki seçeneklere bakarsanız, ikisinin de aynı şeyi yaptıklarını ancak farklı şekillerde göreceksiniz.

pkill, bir işlemin çeşitli özniteliklerini (CMD, PID, PPID, UID ...) eşleştirecek ve eşleşen her işlem için verilen sinyali gönderecektir. (CMD için normal bir ifade kullanılır, diğerleri için ise bir dizedir). pkill etkileşimli değil, toplu programlar için daha iyidir.

killall, komut dizisinin tamamında değil, işlem adı (comm) veya kullanıcı (kullanıcı) üzerinde eşleştirme yapar. Argüman basit bir dize olarak kullanılır ve tüm 'comm' değeriyle eşleşmelidir (bunu değiştirmek için bir --regexp seçeneği de vardır). Killall'ın - çekici ve - pkill'de olmayan seçeneklerden daha genç olanı vardır.

Bir de Killall5, SysV günlerindendir ve diğer UNIX varyantlarına (sözde Ubuntu paketi 'sysutils' altında) aktarılmıştır. Bu eski tarzda farklı davranır. Bu genellikle init betiklerinde dahili olarak kullanılır ve tek kullanıcı moduna geçer.


2
Hayır, ne yazılarda , ne pkillde killallsadece etkileşimli ve dikkatli kullanılmalıdır.
geirha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.