Birden fazla işlem nasıl öldürülür


21

kullanımı öldürme sürecinin PID'sini bulmak için:

pgrep <process command>

Daha sonra döndürülen PID'yi öldürmek için kill komutunu kullanıyorum pgrep <process command>

kill <PID>

Bu komutlar bir araya getirilebilir mi, böylece geri dönen PID veya PID'leri öldürebilir pgrep <process command>mi? Yoksa komut adına göre birden çok işlemi öldürmek için bir yöntem var mı?

Gibi bir şey : kill(pgrep <name of process>)


3
Denedin pkillmi Alternatif olarak, kullanmak isteyebilirsiniz xargs.
MatthewRock

1
Man sayfalarının da böyle şeyler için iyi olduğunu unutmayın. Genellikle size sadece komutu nasıl kullanacaklarını değil, aynı zamanda ilgili komutları da anlatırlar. Bu durumda, pgrepkılavuz sayfası pkillher yerde bahseder (2 komut aynı paketten geldiğinden).
Patrick

Yanıtlar:


27

Pkill kullanabilirsiniz:

pkill httpd

İşlem ikamesini de kullanmak isteyebilirsiniz (bu açık olmasa da):

kill $(pgrep command)

Ve kullanmak isteyebilirsiniz xargs:

pgrep command | xargs kill

4
Bir cevapta benzer bir şey yaptım ve bana bir yarış koşulu getirdiğime dikkat çekti. İşlem kimlikleri pgrepve öğelerine yapılan çağrılar arasında geçersiz kılınabilir kill. Sadece kullan pkill.
Kusalananda

3
@Kusalananda aynı şey pkill, işlem listesini almak ve aslında sinyali göndermek arasında da olabilir , bu durumda görmek daha zordur.
ocaklar

1
kill $(ps|head -1)Yarış koşullarından kaçınmak gibi bir şeyi ilmek yapan bir cevap oluşturmaya çalışacaktım ... ama gerçekten bundan kaçınmanın bir yolu yok. İşlem boru hattının herhangi bir noktasında ölebilir.
Ross Presser

Sadece pkill'e dikkat edin, çünkü bazı programların çalışan birden fazla örneği olabilir ve hepsini öldürmek istemeyebilirsiniz. Önce pgrep koşmak, pgrep ve pkill (yarış) koştuğunuz zaman arasında başka bir tane başlamadığı sürece yardımcı olacaktır.
Joe

1
Bir C programı bile yarış koşulundan kaçınamaz, pencere daha küçük olacaktır. Gerçekten atomik olarak yapmanın tek yolu, süreçleri adıyla öldüren bir sistem çağrısı eklemek olacaktır. Ancak işlem kimlikleri genellikle çok hızlı bir şekilde yeniden kullanılmayacaktır, bu nedenle tehlike neredeyse yoktur.
Barmar

17

Siz de kullanabilirsiniz killall, örn.

killall firefox

SIGTERMtüm firefoxsüreçlere göndermek .


8
killallFarklı unix sistemlerinde farklı anlamları olduğunu unutmayın - Linux olmayan bir sistemdeyseniz belgeleri kontrol ettiğinizden emin olun.
Random832

killall -KILL firefoxsooo ödüllendirici hissedebilir .
boru

Taşınamaz killallolması neden hiç kullanmıyorum. Koşu killallörneğin bir solaris kutuyu felaket.
Patrick

9

Evet, bash özelliğini kullanabilir ve çıktı üzerinde döngü yapabilirsiniz.

$ for proc in $(pgrep <process command>); do kill $proc; done

Anladımkill <no>:failed: operation not permitted
Timo

Muhtemelen doğru izinlere sahip değilsiniz veya işlem artık mevcut değil, lütfen bakınız: superuser.com/questions/1175485/…
lcipriani

0

Dizi ile birden çok işlemi öldürebilirsiniz. Bu durumda siz seçeneklerini belirtebilirsiniz $ip, $hostnameveya benzer bir şey.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
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.