Tek bir komutla çalışan bir işlemin birçok örneğini öldür


75

Varsayalım ki viçalışan herhangi bir işlemin (örneğin ) bin veya daha fazla örneğini var . Hepsini tek bir atış / bir satır komutunda / bir komutta nasıl öldürebilirim?


3
Hangi sistemde çalışmayı düşündüğünüz belli değil. Örneğin, Linux üzerinde kullandığım pkillgelen procpspaketin.
Deer Hunter

Soru genel bir bakış açısıyla soruldu. Killall ve awk / sed aracılığıyla sadece iki işlem biliyordum. Ancak bunu başarmanın başka yolları olup olmadığını bilmek istedim. Farklı sistemlerde farklı şekilde yapılırsa, hangisinde olduğunu bilmek istiyorum. Google'ın kullanımı çok zordur, bunun yerine tüm deneyimli erkeklerle konuşmayı düşündüm.
Kara Şövalye

Yanıtlar:


97

Eskilerin nesi var?

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

Bunu daha verimli hale getirmenin yolları var,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

ve diğer varyasyonları, ancak temel düzeyde, her zaman benim için çalıştı.


1
Oy verildi, sadece ilk varyasyonları biliyordu. İkincisi daha verimli görünüyor, teşekkür ederim.
Kara Şövalye

5
@ TheDarkKnight Bu yöntemle ilgili sorun, genellikle sizin düşündüğünüzden daha fazla öldürmenin sonucudur. Güvenilir bir “bazı aramalar” yazmak çok zordur. Linux altında , inceliklerin çoğunu idare eden pkill kullanın .
Gilles,

O kadar zor olduğundan emin değilim, eğer belirli bir ikiliden sonra gelirseniz oldukça güvenilir olabilir. echo kill -9 $pidZaten her zaman bir ilk olarak çalıştırırım, bu yüzden ne aldığımı biliyorum. AIX'in pkillekmek ve tereyağı UNIX'im olduğundan emin değilim . Ve aşağı oy kullanmak için yeterince kötü mü - garip.
EightBitTony

1
Kesinlikle gerekli olmadıkça, SIGKILL yerine SIGTERM işlemini göndermelisiniz.

Bu iki yöntemin tüm kabuklarda işe yaramayacağını da eklemeliyim, örneğin işe yaramayacakcsh
sekansif olmayan

38

Killall kullanın

killall vi

Bu 'vi' adındaki tüm komutu öldürür.

Aynı zamanda bir sinyal de ekleyebilirsiniz, örneğin SIGKILL

killall -9 vi


Doğru, ayrıca istediğiniz sinyali de ekleyebilirsinizkillall -9 vi
Hola Soy Edu Feliz Navidad

1
Killall'ın buna cevap verdiğini sanmıyorum: Dosyaya göre öldürmek yalnızca yürütme sırasında açık tutulan çalıştırıcılar için işe yarıyor, yani yürütülemezler bu şekilde öldürülemez. Killall adının yazılması, özellikle ayrıcalıklı bir kullanıcı tarafından yapıldığında, Linux dışı sistemler üzerinde istenen bir etkiye sahip olmayabilir. Peki ya bazı Linux olmayan işlemlerin birçok örneğini silmeye çalışıyorsam? killall -w, bir işlemin kaybolup kaybolmadığını ve taramalar arasında aynı PID ile yeni bir işlemle değiştirildiğini algılamaz. İşlemler adlarını değiştirirse, killall bunları doğru şekilde eşleştiremeyebilir.
Kara Şövalye

13
Lütfen bunun yalnızca Linux ve BSD'de çalıştığını unutmayın. Solaris ve diğer bazı sistemlerde killall, adından da anlaşılacağı gibi ... init sürecini öldürür.
Bobby

2
AIX’de, “killall işlemini üretenler hariç, başlattığınız tüm işlemleri iptal eder”.
EightBitTony 12:12

31

pkilleğer varsa, ne öneririm ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). İşlemleri komut adına göre, tam komut satırına veya diğer ölçütlere göre belirleyebilirsiniz. Örneğin pkill vi, komut adı alt dizgiyi içeren tüm programları öldürür vi. Sadece adı verilen işlemleri öldürmek için vikullanın pkill -x vi. Yalnızca vibiten son bir argümanla çağrılan işlemleri öldürmek için .confkullanın pkill -fx 'vi.*\.conf'.

pkillSinyal gönderecek PID'lerin listesini görmek için, pgrepsinyal adını veya numarasını kabul etmemesi dışında, tamamen aynı sözdizimine sahip olan kullanın . Bu işlemler hakkında daha fazla bilgi görmek için,

ps -p "$(pgrep …)"

Linux altında, ps -p $(pgrep -d, …)bunun yerine ihtiyacınız var (bu bir hata: Linux's psPOSIX uyumlu değil).

Öldürülecek işlemleri tanımlamanın başka bir yaygın yolu, belirli bir dosyanın açık olduğu işlemlerdir (işlemin çalıştırılabilir olabilir). Bunları listeleyebilirsiniz fuser; fuser -kOnlara bir sinyal göndermek için kullanın . Örneğin, fuser -k /usr/bin/findçalışan tüm örnekleri öldürür find.

Eğer çatallaşmaya devam eden kaçak bir işlem varsa, tüm işlem grubunu bir kerede öldürmeniz gerekebilir . Bir süreç grubu, gruptaki tüm süreçlerin ata süreci olan liderinin negatifi ile tanımlanır. Bir işlemin ait olduğu işlem grubunu görmek için, çalıştırın ps -o pgid(artı hangi işlemin görüntüleneceğini seçmek için herhangi bir seçenek). İşlem grubu lideri 1234'ü ve onun tüm çocuklarını öldürmek istediğinizi belirlerseniz, koşun kill -1234ya kill -HUP -1234da başka bir sinyal verin.

Daha iyi bir yol bulamıyorsanız, pstüm işlemleri listelemek ve grepbaşka bir metin filtreleme komutu ile filtrelemek için uygun seçeneklerle kullanın. Komutu benzer bir isimle veya bu ismi içeren bir argümanla yürüten diğer işlemlerin yanlışlıkla eşleşmemesine dikkat edin. Örneğin:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

Sizin grepveya awkkomutunuzun kendisinin psçıktıda listelendiğini unutmayın ( psve filtreleme komutu paralel olarak başlatılır, böylece gösterilip gösterilmeyeceği zamanlamaya bağlıdır). Komut argümanları psçıktıya dahil edilmişse bu özellikle önemlidir .


Çok teşekkürler, bu gerçekten harika. Verdiğiniz şey bir nevi öğretici. Tekrar teşekkürler . Oy verildi
Kara Şövalye

6

pkillburada çok güzel Deseni iyileştirmek için birçok parametre verebilirsiniz.


Tüm UNIX'lerde mevcut değildir ve söz konusu olan belirli bir UNIX veya UNIX benzeri işletim sisteminden söz edilmez.
EightBitTony 12:12

@EightBitTony pkillLinux, BSD ve Solaris - afaik'te mevcuttur. Bu yüzden daha büyük bir yayılıma sahiptir killall.
Nils,

Katılıyorum, ama öldürme daha da sorunlu çünkü aynı adı taşıyan, görünüşte çok farklı davranışlara sahip birden fazla araç var. Ben de Killall'ın cevaplarını sevmiyorum. pkill, AIX veya HP-UX'te mevcut değildir ve bazılarının inanmaktan hoşlanmasına rağmen, hala dünyadaki Linux olmayan UNIX tabanlı bir sistem vardır.
EightBitTony 12:12

1
@EightBitTony bu yüzden cevabınız kabul edilen cevaptır. Fakat onu Solaris'te kullanmam (ki bu da Unix).
Nils,

6

Bunu yapmanın en kolay yolu, öncelikle aşağıdaki işlem kimliklerini aldığınızı kontrol etmektir:

pgrep -f [part_of_a_command]

Sonuç beklendiği gibi ise. İle git:

pkill -f [part_of_a_command]

veya kullanın:pgrep -f "command name"
Magne

3

İlginç kimse bundan bahsetmedi. pidof , geçen işlemin adı ile eşleşen boşluklarla ayrılmış işlemlerin çıkışlarını verir. Bu nedenle, çıkışını killboru kullanmadan doğrudan kullanabilirsiniz . Arch Linux'ta kullanıyorum

kill -9 $(pidof <proc name>)

Bu çözümün dezavantajı, düzenli ifadelerin kullanımına izin vermemesidir.


0

Denemenizi öneririm pkill.

Ör: ps -ef | pkill -f command

Öldürülecek tüm işlemlerin listesini ilk önce göstermeye çalışın pgrep:

Ör: ps -ef | pgrep -f command


1
Çıkışını veya ps -efiçine borulamanın amacı nedir ? Bu komutlar standart girdiden okunmaz. pkillpgrep
Kusalananda

0

Aşağıdaki komutu kullanarak birden fazla işlemi öldürebilirsiniz.

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

Bunun, yukarıdaki desene uyan işlemi öldüreceğini, araçların process1abc process2def process3ghida öldürüleceğini unutmayın.


-1

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

Hatırlamak ve benim için iyi çalıştı yeterince basitti.


-2
$ ps -eaf  | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill

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.