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
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
Yanıtlar:
pkill -f
Komut satırının herhangi bir parçası için desenle eşleşen kullanın
pkill -f my_pattern
pkill
- en yaygın hata, her bir ikiliğin sadece bir örneğinin herhangi bir zamanda var olabileceği varsayımıdır.
killall -m my_pattern
.
pgrep
öldüreceğinizi doğrulamak için önce kullanmanızı öneririz . pgrep -l
İşlem adlarını veya pgrep -a
tam komut satırlarını görmek için kullanabilirsiniz . Pkill ile aynı bayrakları kullanır. Yani bu durumda kullanabilirsiniz pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Bu kod ne yapıyor?
Bu ps -ef
kullanıcı tarafından görülebilen bilgisayarda işlem kimlikleri listesi oluşturur. Pipe grep, bu dizeyi içeren satırları filtreler. grep -v grep
Grepping 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.
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 kill
parçayı zarif bir kapatma gerektiren iletilen bir bayrakla değiştirmeyi deneyin ve yalnızca bu istek reddedilirse,kill -9
İş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 -ef
olabilecek 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.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
Herhangi bir argüman verilmemişse, xargs komutunun yürütülmemesi için kullanmak isteyebilirsiniz .
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ü.
-r
seçeneği OS X'te mevcut değil, öyle görünüyor.
İş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.
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).
ps
üç süreçleri 123, 234 ve 345 döndürür yapabilirsiniz kill 123 234 345
yapabildiğiniz gibi rm
veya cat
çoklu dosya argümanlar.
grep
for KILLPID in
ps balta | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
grep'i kaldıracak
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 }')
İş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
-r
da --regexp
bunlara ihtiyacınız vardır.
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.
Kulağa kötü geliyor mu?
pkill `pidof myprocess`
misal:
# kill all java processes
pkill `pidof java`
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.
kullanmak en iyi ve en güvenli pgrep -f
olan kill
, ya da sadece pkill -f
, grep
ing ps
'ın çıkışını ters gidebilir.
Desen hileleri ps | grep
ekleyerek | grep -v
veya kullanarak grep hattını filtrelemeniz gereken kullanımdan farklı olarak , pgrep
tasarımla kendini seçmez.
Dahası, deseniniz ps
's UID
/ USER
, SDATE
/ START
veya 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
+ pkill
bu 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$"
Eugen Rieck'in cevabını aldım ve onunla çalıştım. Kodum aşağıdakileri ekler:
ps ax
grep içerir, bu yüzden onu hariç tuttum grep -Eiv 'grep'
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
my_pattern
basitçe isminin bir alt ya da herhangi bir normal ifadedeki özel karakterler içeriyor?