Bir işlemi bash ve regex kullanarak bir satırda bulun ve öldürün


648

Programlama sırasında genellikle bir işlemi öldürmem gerekir.

Şimdi bunu yapmanın yolu:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

İşlem kimliğini otomatik olarak nasıl ayıklayabilir ve aynı satırda öldürebilirim?

Bunun gibi:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

3
İnan bana! : 'D Seçtiğiniz ilk cevap, cevabınızda anlattığınız çözümden çok daha karmaşıktır. Yolunu seçmeyi tercih ederim.
Santosh Kumar

sürecin mevcut olup olmadığını kontrol etmenin en iyi yolu: stackoverflow.com/questions/3043978/…
Trevor Boyd Smith

Yanıtlar:


1398

İçinde bashşunları yapabilmelisiniz:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

Çalışmaları ile ilgili detaylar aşağıdaki gibidir:

  • psSize tüm işlemlerin listesini verir.
  • grepArama dizisi dayalı, filtreler [p]bir hile olmadığı ve gerçek toplayıp durdurmak için grepsürecin kendisini.
  • awkSadece sana PID olan her satırın, ikinci alanını verir.
  • $(x)Yapı araçları çalıştırmak için xdaha sonra çıkışını alıp komut satırında koydu. psYukarıdaki yapı içindeki bu boru hattının çıktısı, işlem kimlikleri listesidir, böylece bir komutla sonuçlanırsınız kill 1234 1122 7654.

İşte bunu gösteren bir konuşma metni:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

ve tüm uyuyanları sonlandırdığını görebilirsiniz.


Açıklanması grep '[p]ython csp_build.py'biraz daha ayrıntılı olarak biraz:

Bunu sleep 3600 &takip ps -ef | grep sleepettiğinizde , içinde iki işlem yapma eğilimindesiniz ve ve (çünkü her ikisinde de var , bu roket bilimi değil).sleepsleep 3600grep sleepsleep

Bununla birlikte, ps -ef | grep '[s]leep'içinde bir işlem oluşturmaz sleep, bunun yerine yaratır grep '[s]leep've işte zor bit: grepbulamaz, çünkü karakter sınıfından herhangi bir karakter [s]( sardından) normal ifadeyi arar leep.

Başka bir deyişle, aradığı sleepancak grep süreçtir grep '[s]leep'sahip olmadığı sleepo.

Bunu gösterdiğimde (burada SO'daki biri tarafından), hemen kullanmaya başladım çünkü

  • eklemekten daha az bir süreç | grep -v grep; ve
  • zarif ve sinsi, nadir bir kombinasyon :-)

2
@paxdiablo, bunun için bir bağlantı sağlayabilir misiniz? Neden işe yaradığına şaşkınım.
glenn jackman

58
Yalnızca awk kullanabilirsiniz - ps aux | awk '/ [b] eam / {print $ 2}' , grep gerekmez
Yola

20
Sadece pgrep veya pkill'i kullanmak daha iyi
NGix

2
Küçük bir sorun var - süreç zaten sonlandırıldıysa, bu üretim hattı killstandart çıktı ile kaybolacakkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Lionel Chan

5
Yerine grep '[p]ython csp_build.py'size de kullanabilirsiniz: kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}'). grep -veşleşmeyen satırları döndürür.
usandfriends

138

pkill'iniz varsa,

pkill -f csp_build.py

Yalnızca işlem adına (tam bağımsız değişken listesi yerine) karşı grep yapmak istiyorsanız, bırakın -f.


1
Bunu test ettiğimde hiçbir şey olmadı.
Orjanp

8
Doğru işlemi geçtiğinizi doğrulamak için önce pgrep kullanın. sonra tekrar doğru desende pkill kullanın.
ghostdog74

18
+1. pgrepve pkillişlemi doğru bir şekilde belirtmeye özen gösterdiğiniz sürece çalışın. Varsayılan olarak yalnızca işlem adı eşleştirilir, bu durumda bu kesinlikle neredeyse "python" olur. Kullanım pgrep -f "python csp_build.py"tam komutunu eşleşecek.
mr.spuratic

3
Sen öldürmek zorlamak gerekebilirpkill -9 -f csp_build.py
studgeek

1
Bu gerçekten kabul edilmiş ve en çok oy alan cevap olmalı; tüm bu işlere sahip olan diğer türler gereksizdir. Umarım bu sayfayı bulanlar ilk cevabın ötesinde okurlar.
Jason C

89

Bir astar:

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

  • 2. sütunu yazdır: awk '{print $2}'
  • sudo İsteğe bağlı
  • Koş kill -9 5124, kill -9 5373vb. (Kill -15 daha zarif ama biraz daha yavaştır)

Bonus:

Ayrıca .bash_profile (~ / .bash_profile osx için tanımlanmış 2 kısayol işlevim var, * nix makineniz için neyin işe yaradığını görmek zorundasınız).

  1. p anahtar kelime
    • anahtar kelime içeren tüm P işlemlerini listeler
    • kullanım örn .: p csp_build, p pythonvb.

bash_profile kodu:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka anahtar kelime
    • K dertlerin A bu anahtar kelimeyi var ll süreçleri
    • kullanım örn .: ka csp_build, ka pythonvb.
    • Opsiyonel öldürmek seviyesi örneğin: ka csp_build 15,ka python 9

bash_profile kodu:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

Hatırlatma - Yeni işlevleri yüklemek için bash kabuğunu (terminal) yeniden başlatmayı unutmayın. VEYA source ~/.bash_profileyeni işlevleri almak için geçerli kabukta çalıştırın (tercih ettiğim budur).
a20

Buradaki diğer cevapların birçoğu gibi, bu anıtsal olarak kullanışsızdırgrep . Unutmayın, benzeyen herhangi bir şey grep x | awk '{ y }'genellikle yerine daha iyi ve genellikle daha sağlamdırawk '/x/ { y }'
tripleee

1
@tripleee link verdiğiniz web sitesi size ait değil mi? Çeşitli yorumlar bölümlerinin hepsine bağladığınızı fark ettim. SEO oluşturmaya mı çalışıyorsunuz?
a20

Hayır, SEO ile ilgilenmiyorum. Farkındalık oluşturmayı umuyorum.
üçlü

1
.. Web sitenize kurulmuş bir yetki sitesi gibi bağlantı kurarak. Güzel. Ayrıca, grep daha hızlıdır .
a20

16
killall -r regexp

-r, --regexp

İşlem adı desenini genişletilmiş normal ifade olarak yorumlama.


15

Kullanmayı deneyin

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

Biraz değiştirmek zorunda kaldım. Bu işe yaradı. Teşekkürler. :) ps aux | grep 'python csp_build.py' | kafa -1 | kes -d "" -f 5 | xargs kill
Orjanp

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs killbenim için çalıştı. thanx
Rasika Perera

Unutmayın çocuklar, Awk her şeyi grepyapabilir ve çoğunu basit ve zarif bir şekilde yapabilir. Önemsiz durum grep x y | awk '{ z }'her zaman daha iyi yazılmıştır awk '/x/ { z }' y- ayrıca işe yaramaz kullanımıgrep .
Üçlü

11

Sadece kullanabilirsiniz pkill '^python*' normal ifade süreci öldürme için .

Eğer öldürmeden önce ne öldüreceğinizi veya bulacağınızı görmek istiyorsanız, sadece pgrep -l '^python*'-l çıktıları da sürecin adını kullanın . Kullanmak istemiyorsanız pkill, sadece şunu kullanın:

pgrep '^python*' | xargs kill


8

Pgrep kullanın - birçok platformda bulunur:

kill -9 `pgrep -f cps_build`

pgrep -f "Pps_build" tesadüfüyle tüm PID'leri döndürür


2
Eğer varsa, sahip pgrepolacaksın pkill. Her zaman olduğu gibi kullanmayınkill -9 neden biliyor sürece kill -15(varsayılan) veya kill -2çalışma olmaz.
tripleee

Bu , yanlış yönlendirmeyi atlayan-9 ve uygun modern komut değiştirme sözdizimini kullanan @ nathanael'in cevabının daha kötü bir açıklamasıdır . Bunun yerine oy verin; tabii ki pkillcevap hala daha iyi.
tripleee

@tripleee Bu durumda öldürmek -9 tam olarak istediğim şey - aşırı önyargı ile tüm suçluları sonlandırmak. Üstelik yıllardır sorunsuz bir şekilde kill -9 kullanıyorum. Benim düşünceme göre, her zaman bir saflar kampı, bir şeyler yapma gerçekçi realistleri kampı olacak ve ben ikincisine aitim (bu konuda).
a20

"Nedenini bilmiyorsanız" bölümünü kaçırdınız mı? Ben her şeyi halletmek için çalışıyorum, ama bu -9aslında ne anlama geldiğini anlayana kadar kendinizi ayağa vurmanın yaygın yollarından biridir .
Üçlü

@ tripleee hey tripleee, son zamanlarda haklı olduğunu buldum, öldürmek -15 daha iyi bir seçim çünkü app zarifçe kendini öldürmek için şans verir. Kodumu buna göre değiştirdim: stackoverflow.com/a/30486159/163382
a20

7

Bu yalnızca pid'i döndürür

pgrep -f 'process_name'

Yani herhangi bir işlemi tek bir satırda öldürmek için:

kill -9 $(pgrep -f 'process_name')

veya sürecin tam adını biliyorsanız pidof'u da deneyebilirsiniz:

kill -9 $(pidof 'process_name')

Ancak, sürecin tam adını bilmiyorsanız, pgrepdaha iyi olurdu.

Aynı adla çalışan birden fazla işlem varsa ve ilkini öldürmek istiyorsanız:

kill -9 $(pgrep -f 'process_name' | head -1)

Ayrıca, büyük / küçük harfe duyarlılık konusunda endişeleriniz varsa, tıpkı grep'te olduğu gibi -i seçeneği ekleyebilirsiniz. Örneğin:

kill -9 $(pgrep -fi chrome)

En sinyaller ve pgrep hakkında daha fazla bilgiye man 7 signalveya man signalveman pgrep


5

awk ve backtics ile yapabilirsiniz

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

Awk içinde $ 2 sütun 2 yazdırır ve backtics yazdırılan deyimi çalıştırır.

Ancak python işleminin işlem kimliğini / var / run'da saklaması için çok daha temiz bir çözüm olacaktır ve daha sonra bu dosyayı okuyabilir ve öldürebilirsiniz.


O zaman hem 5124 hem de 5373 işlemlerini öldürmeyecek misiniz? Sanırım bu bir sorun değil.
Orjanp

bir sorun olmamalı, ancak her zaman grep sürecini dışlamak için başka bir grep ekleyebilirsiniz: grep ve awk arasında "grep -v grep"
Alexander Kjäll

Biraz değiştirilmiş bir komutla test edilmiştir. Ama süreci öldürmedi, sadece basılı öldür <pid>. ps auxf | grep '[p] ython csp_build.py' | awk '{print "kill" $ 2}'
Orjanp

Sadece "kill" $ 2 ifadesini bir sistemle ("kill" $ 2) değiştirmek gerekiyordu. Sonra işe yarıyor. :)
Orjanp

5

Görevim, belirli bir dizine yerleştirilen normal ifadeyle eşleşen her şeyi öldürmekti (selenyum testlerinden sonra her şey durmadı). Bu benim için çalıştı:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

-9Seçeneği killbelki de fazla agresif olduğunu. Kaynaklarını serbest bırakmalarına izin vermez.
Birei

Güzel! Birden fazla eşleştirme işlemi olabileceğini düşünen tek kişi! Küçük bir not: grep işleminin kendisinin işlem listenizde görünmemesini sağlamak için borulara bir "grep -v grep" veya bunun gibi bir şey eklemek isteyebilirsiniz.
Brad Parks

killdöngü temel olarak işe yaramaz şekilde birden çok işlemi kabul eder; Başka yerde bu sayfada belirtildiği gibi ve kullandığınız edilmemelidir kill -9sen olmadıkça bilmek süreç sadece yanıt vermez o kill.
tripleee

Kaldır -9 büyük bir anlaşma değil, neden aşağı oy. Cevabı düzenlesen iyi olur.
Serge

5

İşlemi anahtar kelimeye göre öldürmek midoriiçin, örneğin:

kill -SIGTERM $(pgrep -i midori)


3

Yalnızca awk(ve ps) kullanılan bir yöntem :

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

Dize eşitliği testi kullanarak bu işlemin kendisiyle eşleşmesini önlerim.


Bazı nedenlerden ötürü "python csp_build.py" tuşuna basmıyorum. Ancak "python" tek başına vurur.
Orjanp

3
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

Günlük limit nedeniyle +1 yapılamıyor, ancak seçenekle psbirlikte -okullanılmaya değer.
P

ps bana fazla vermeyin. [~] $ ps PID TTY TIME CMD 6365 puan / 6 00:00:00 ps 29112 puan / 6 00:00:00 bash
Orjanp

3

Pkill'e -f ver

pkill -f /usr/local/bin/fritzcap.py

.py dosyasının tam yolu

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

2

Böyle bir şey kullanmaya başladım:

kill $(pgrep 'python csp_build.py')

1

Kendi süreçlerimizi öldürmek ortak bir PPID'den başlayan oldukça sık, bayrakla ilişkili pkill–P benim için bir kazanan. @ Ghostdog74 örneğini kullanma:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

1

Ps için kullanıcı anahtarına ihtiyacınız yoktur.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

1

Bazı durumlarda, bu şekilde benzer şekilde öldürme işlemlerini istiyorum:

Sleep ~ uyku 1000 ve
[1] 25410
Sleep ~ uyku 1000 ve
[2] 25415
Sleep ~ uyku 1000 ve
[3] 25421
Sleep ~ uyku pidof
25421 25415 25410
➜ ~ `pidof uyku 'öldürmek
[2] - 25415 sonlandırılmış uyku 1000                                                             
[1] - 25410 sonlandırılmış uyku 1000
[3] + 25421 sonlandırılmış uyku 1000

Ancak, sizin durumunuzda biraz uygunsuz olduğunu düşünüyorum. (Arka planda python a, python b, python x ... çalışıyor olabilir.)


1

Eğer pkill -f csp_build.pysüreci öldürmek değil ekleyebilir -9göz ardı etmeyecek bir öldürme SIGNALL göndermek. yanipkill -9 -f csp_build.py


1

Çözüm , süreçleri tam desenle filtrelemek, pid'i ayrıştırmak ve kill işlemlerini yürütmek için bir argüman listesi oluşturmak olacaktır:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

Belgeleme açıklaması :

ps yardımcı programı bir başlık satırı görüntüler, ardından kontrol terminalleri olan tüm işlemleriniz hakkında bilgi içeren satırlar görüntülenir.

-e Bunlar da dahil olmak üzere diğer kullanıcıların işlemleri hakkında bilgi görüntüleme

-f Kullanıcı kimliği, pid, üst pid, son CPU kullanımı, işlem başlangıcını görüntüleme

Grep herhangi bir giriş dosyaları verilen yarar arar seçme hatları o

-e pattern, --regexp = pattern Girdinin aranması sırasında kullanılan bir model belirtin: belirtilen modellerden herhangi biriyle eşleşiyorsa bir girdi satırı seçilir. Bu seçenek, birden çok desen belirtmek için birden fazla -e seçeneği kullanıldığında veya bir desen tire işareti (`- ') ile başladığında yararlıdır.

xargs - argüman listesini oluştur ve yardımcı programı çalıştır

öldür - bir süreci sonlandır veya bildir

9 numara sinyali - KILL (yakalanamayan, ihmal edilemez öldürme)

Örnek :

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

Ben komut dosyası çarptı ve cpu dayak yaparken Firefox öldürmek için bunu kullanın :) 'Firefox' ölmek istediğiniz uygulama ile değiştirin. Bash kabuğundayım - OS X 10.9.3 Darwin.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


Değiştirme grep Firefox | awk 'NR == 1 { next } ...'ile awk 'NR == 1 || $11 !~ /Firefox/ { next } ...'sadece bir süreç kazandırmanın yanı sıra hassasiyet geliştirir. Bu kurtulmak zor değil sort | uniqsaf awk ya (ders arasında ise uniq | sortsadece yanlış - bu bitişik olmayan herhangi çiftleri kaçırma, ve gereksiz yere sıralayarak hatayı gizler çıkışı arasında uniq).
tripleee

0

Kullandığım gkill processnamegkill Aşağıdaki komut dosyası olduğu,:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

Not: komut satırlarında "grep" olan işlemleri öldürmez.


1
Yak kulübesinin diğer birçok yeniden icadı gibi, bu da işe yaramaz kullanımgrep ve diğer yaygın kabuk komut dosyası anti-desenleriyle doludur .
tripleee

-1

Aşağıdaki komut kullanışlı olacaktır:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

Örneğin., ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

İşlem hala takılı kaldıysa, hardkill için "-9" uzantısını aşağıdaki gibi kullanın:

kill -9 $(ps -elf | grep top| awk {'print $4'})

Umarım yardımcı olur...!


-1

Bul ve bash tek bir satırda tüm işlemleri öldürmek.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'- Kalıpla eşleşen çalışan işlem ayrıntılarının listesini (uname, pid, vb.) Verir. Çıktı listesi, greponu arayan bu komutu da içerir . Şimdi öldürmek için bu grepkomut sürecini göz ardı etmemiz gerekiyor .
  • ps -ef | grep '<exec_name>' | grep -v 'grep'- ile başka bir grep eklemek -v 'grep'geçerli grep işlemini kaldırır.
  • Sonra kullanarak awksüreç kimliği yalnız olsun.
  • Sonra bu komutu içeride tutun $(...)ve killtüm süreci öldürmek için komuta iletin.

-1

Komutun pid'ini listelemek için aşağıdaki komutu kullanabilirsiniz. Linux'ta tüm işlemleri görüntülemek için üst veya daha iyi kullanın. Burada adında bir işlemi öldürmek istiyorum

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

Ve pid'i doğrulayın. Onları öldürmek için kill komutunu kullanın.

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

Örn: - htop işlem listesindendir.

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

Bu sorunlarımı çözer. Bir işlemi yanlışlıkla öldürürseniz, her zaman işlemi yeniden başlatmaya hazır olun.

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.