Belirli bir kısmi adla tüm süreçleri nasıl öldürürüm? [kapalı]


622

Aldığım tüm süreçleri öldürmek istiyorum:

ps aux | grep my_pattern

Nasıl yapılır?

Bu çalışmıyor:

pkill my_pattern

11
my_patternbasitçe isminin bir alt ya da herhangi bir normal ifadedeki özel karakterler içeriyor?
Sven Marnach

Yanıtlar:


1317

pkill -fKomut satırının herhangi bir parçası için desenle eşleşen kullanın

pkill -f my_pattern

7
@Jayan: Öldürülmesinde de oldukça gelişigüzel.
Yanlış bir

1
@Jayan: Beni ikna etmeyeceksin :-). Kullanmakta ısrar eden üçüncü taraf senaryoları tarafından çok fazla yakıldım pkill- en yaygın hata, her bir ikiliğin sadece bir örneğinin herhangi bir zamanda var olabileceği varsayımıdır.
thkala

4
Bu yanıtı bulan tüm Mac kullanıcıları için, benim yaptığım gibi, Mac eşdeğeridir killall -m my_pattern.
Zev Eisenberg

1
Öldürülmeyen bir dizi asılı süreciniz varsa, onları acımasızca öldürmek için pkill -f -9 kullanın
MacK

18
Ne pgrepöldüreceğinizi doğrulamak için önce kullanmanızı öneririz . pgrep -lİşlem adlarını veya pgrep -atam komut satırlarını görmek için kullanabilirsiniz . Pkill ile aynı bayrakları kullanır. Yani bu durumda kullanabilirsiniz pgrep -fa my_pattern.
studgeek

158

"MyProcessName" dizesiyle eşleşen tüm işlemleri öldür:

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Kaynak: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Bu kod ne yapıyor?

Bu ps -efkullanıcı tarafından görülebilen bilgisayarda işlem kimlikleri listesi oluşturur. Pipe grep, bu dizeyi içeren satırları filtreler. grep -v grepGrepping yapıyor sürecinin kendisi üzerinde eşleşmeyen söylüyor. Boru awk print, varsayılan sınırlayıcı boşluktaki satırları böler ve işlem kimliğimiz olan ikinci sütuna filtre uygular. Boru xargs, tüm bu pidleri göndermek için yeni bir süreç döndürür ve hepsini bitirir kill -9.

Yukarıdaki kod, çeşitli nedenlerle kötü, tehlikeli, çirkin ve hacklidir.

  1. Zorla sonlanan kod herhangi bir veritabanı ops veya düşük olasılıklı yarış koşulları ile güvenli işlemler yapıyorsa, zamanın yüzde bir kısmı, bu işlemin atomikliği harap olacak ve tanımlanmamış davranış üretecektir. öldürmek -9 esir almaz. Kodunuz buna karşı duyarlıysa, xargs killparçayı zarif bir kapatma gerektiren iletilen bir bayrakla değiştirmeyi deneyin ve yalnızca bu istek reddedilirse,kill -9

  2. İşletim sistemini yanlışlıkla sonlandırma veya ilişkisiz bir işlemde tanımlanmamış davranışa neden olma olasılığınız yoktur, bu nedenle tüm sistem kararsızlığına yol açar, çünkü ps -efolabilecek her işlemi listeler ve bazı garip 3. taraf kitaplıklarının işlem adı, ya da okuma ve yürütme kill -9 arasındaki sürede, süreç kimliği başka bir şeye dönüştü ve şimdi yanlışlıkla istemediğiniz bazı rastgele işlemleri sonlandırdınız.

Ancak, riskleri anlar ve onlar için çok benzersiz isimlerle kontrol ederseniz ve birkaç bırakılan işlem veya ara sıra veri bozulması ile sorun yaşıyorsanız, zamanın% 99,9'u iyi olacaktır. Bir sorun varsa, bilgisayarı yeniden başlatın, herhangi bir işlem çakışması olmadığından emin olun. Bu tür bir kod nedeniyle teknik destek komut dosyası yapar: "Bilgisayarınızı yeniden başlatmayı denediniz mi" seviye 5 meme.


15
Bu, adla eşleşen hiçbir işlem bulunmazsa bir hata atar. ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9Herhangi bir argüman verilmemişse, xargs komutunun yürütülmemesi için kullanmak isteyebilirsiniz .
Epigene

2
Sadece küçük bir değişiklik, belki de işlem adını belirtmek daha iyidir: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 Tırnaklar olmadan, ilk çalıştırmada arka plan işlemlerimden sadece biri öldürüldü. Tekrar koşmak gerisini öldürdü.
Ali Haider

-rseçeneği OS X'te mevcut değil, öyle görünüyor.
Danijel

52

İşlemleri seçerken daha fazla esnekliğe ihtiyacınız varsa

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Grep -e vb. Kullanabilirsiniz.


4
-1 Bir döngüye ihtiyacınız yoktur, sadece yapabilirsiniz kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(ayrıca yeniden düzenleme de not edin; @ synthesizerpatel'in cevabı hakkındaki yorumuma bakın).
tripleee

11
senin downvote ile hiçbir sorun @tripleee ama bunu OQ olduğu, farkına |: "grep my_pattern ps aux ben almak o tüm işlemleri öldürmek istiyorum" Ben dutyfully kabul.
Eugen Rieck

Kill tüm süreçleri tek seferde öldürecek, bunun için bir döngüye ihtiyacınız yok. Eğer psüç süreçleri 123, 234 ve 345 döndürür yapabilirsiniz kill 123 234 345yapabildiğiniz gibi rmveya catçoklu dosya argümanlar.
tripleee

@tripleee Ben çıkarmagrep
Eugen Rieck

for KILLPID in ps balta | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; donegrep'i kaldıracak
Justin E

18

işlemi listelemek için aşağıdaki komutu kullanabilirsiniz

ps aux | grep -c myProcessName 

bu işlemin sayısını kontrol etmeniz gerekiyorsa çalıştırın

ps aux | grep -c myProcessName |grep -v grep 

bundan sonra kullanarak işlemi öldürebilirsiniz

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

işlemi listelemek için aşağıdaki komutu kullanabilirsiniz ps aux | Bu işlemin sayısını kontrol etmeniz gerekiyorsa grep -c myProcessName sonra ps aux | grep -c myProcessName | grep -v grep, bundan sonra kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}') kullanarak süreci öldürebilirsin
Nived Thanima

13

Ayrıca kullanabilirsiniz killall -r my_pattern. -rİşlem adı desenini genişletilmiş normal ifade olarak yorumlama.

killall -r my_pattern

8

Eğer yargıç ise pkill -f PATTERNçok tehlikeli biraz yazdım ezkill istemi sen öldürmek istiyorum ŞABLONUNUN maç olanlar arasında işleyen seçmenize bir bash betiği.


7

Aşağıdakileri yapmak için aşağıdaki komutu kullanabilirsiniz:

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

4

İşlem kimliği bulma baş ağrısını almak istemiyorsanız, işlemi adıyla öldürmek için regexp kullanın. Örneğin, aşağıdaki kodu krom öldürmek için hile yapacak.

killall -r --regexp chrome


1
Sırasıyla yalnızca kısa ya da GNU uzun seçenek olan ya -r da --regexp bunlara ihtiyacınız vardır.
BigSmoke

3

Aşağıdakileri yapmak için aşağıdaki komutu kullanabilirsiniz:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

veya

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Benim için çalışıyor.


1
StackOverflow'a hoş geldiniz. Kod satırlarınız için kod blokları olarak biçimlendirilmeleri için lütfen 4 satır veya sekme girinti kullanın. Saygılarımla
YakovL

2

Kulağa kötü geliyor mu?

 pkill `pidof myprocess`

misal:

# kill all java processes
pkill `pidof java`

2

Desteklemeyen bir sunucu için bunu yapmanın en iyi yolunu buldum pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

İlmek zorunda değilsiniz.


1

kullanmak en iyi ve en güvenli pgrep -folan kill, ya da sadece pkill -f, greping ps'ın çıkışını ters gidebilir.

Desen hileleri ps | grepekleyerek | grep -vveya kullanarak grep hattını filtrelemeniz gereken kullanımdan farklı olarak , pgreptasarımla kendini seçmez.

Dahası, deseniniz ps's UID/ USER, SDATE/ STARTveya başka bir sütunda görünürse , çıktıda istenmeyen süreçler alır ve onları öldürürsünüz, pgrep+ pkillbu kusurdan muzdarip olmazsınız.

Ayrıca düzenli ifademle çalışmadığını killall -r/ -regexp çalışmadığını gördüm.

pkill -f "^python3 path/to/my_script$"

man pkill


0

Eugen Rieck'in cevabını aldım ve onunla çalıştım. Kodum aşağıdakileri ekler:

  1. ps ax grep içerir, bu yüzden onu hariç tuttum grep -Eiv 'grep'
  2. İnsan tarafından okunabilir hale getirmek için birkaç ifs ve eko eklendi.

Adında bir dosya oluşturdum killserver, işte gidiyor:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Sonuçlar

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

Bu şekilde:

kill -9 $(pgrep -d' ' -f chrome)

3
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Igor F.19
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.