Chcę zabić wszystkie procesy, które otrzymuję:
ps aux | grep my_pattern
Jak to zrobić?
To nie działa:
pkill my_pattern
Chcę zabić wszystkie procesy, które otrzymuję:
ps aux | grep my_pattern
Jak to zrobić?
To nie działa:
pkill my_pattern
Odpowiedzi:
Użyj pkill -f
, która pasuje do wzorca dla dowolnej części wiersza poleceń
pkill -f my_pattern
pkill
- najczęstszym błędem jest założenie, że w danym momencie może istnieć tylko jedna instancja każdego pliku binarnego.
killall -m my_pattern
.
pgrep
najpierw użyć do sprawdzenia, co zamierzasz zabić. Możesz użyć, pgrep -l
aby zobaczyć nazwy procesów lub pgrep -a
zobaczyć pełne wiersze poleceń. Używa tych samych flag co pkill. Więc w tym przypadku możesz użyć pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Co robi ten kod?
ps -ef
Tworzy listę identyfikatorów proces na komputerze widocznym dla tego użytkownika. Grep potoku odfiltrowuje to dla wierszy zawierających ten ciąg. grep -v grep
Mówi nie zgadzają się na samym procesie robi grepping. Wydruk awk potoku mówi o podziale wierszy w domyślnym białym znaku ogranicznika i przefiltrowaniu do drugiej kolumny, która jest naszym identyfikatorem procesu. Xargs potokowy uruchamia nowy proces wysyłania wszystkich pidów kill -9
, kończąc je wszystkie.
Powyższy kod jest zły, niebezpieczny, brzydki i zhackowany z kilku powodów.
Jeśli kod, który jest wymuszony, wykonuje operacje bazy danych lub zabezpiecza transakcje w warunkach wyścigu o niskim prawdopodobieństwie, przez ułamek procentu czasu atomowość tej transakcji zostanie zniszczona, co spowoduje niezdefiniowane zachowanie. zabij -9 nie bierze jeńców. Jeśli twój kod jest wrażliwy na to, spróbuj zastąpić xargs kill
część przesłaną flagą, która żąda płynnego zamknięcia, i tylko w przypadku odrzucenia tego żądania, w ostatecznościkill -9
Istnieje niezerowa możliwość, że przypadkowo zakończysz system operacyjny lub spowodujesz niezdefiniowane zachowanie w niepowiązanym procesie, co doprowadzi do niestabilności całego systemu, ponieważ ps -ef
zawiera listę wszystkich możliwych procesów, które mogą istnieć, i nie możesz być pewien, że jakaś dziwna biblioteka innej firmy udostępnia twoje nazwa procesu, lub że w czasie od odczytu do wykonania kill -9 procesid zmienił się na coś innego, a teraz przypadkowo zakończyłeś jakiś losowy proces, którego nie chciałeś.
Ale jeśli rozumiesz ryzyko i kontrolujesz je za pomocą bardzo unikalnych nazw i jesteś w porządku z kilkoma porzuconymi transakcjami lub okazjonalnym uszkodzeniem danych, wtedy 99,9% czasu będzie dobrze. Jeśli występuje problem, uruchom ponownie komputer, upewnij się, że nie ma żadnych kolizji procesów. To właśnie z powodu takiego kodu skrypt obsługi technicznej: „Czy próbowałeś ponownie uruchomić komputer” to mem na poziomie 5.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
aby xargs nie wykonywał polecenia, jeśli nie podano żadnych argumentów.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Bez cudzysłowu tylko jeden z moich procesów w tle został zabity przy pierwszym uruchomieniu. Ponowne uruchomienie zabiło resztę.
-r
opcja nie istnieje w OS X, więc wydaje się.
Jeśli potrzebujesz większej elastyczności w wyborze procesów, skorzystaj
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Możesz użyć grep -e itp.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(zwróć uwagę również na refaktoryzację; zobacz także mój komentarz do odpowiedzi @ synthesizerpatel).
ps
zwróci trzy procesy 123, 234 i 345, możesz kill 123 234 345
tak jak możesz rm
lub cat
wiele argumentów pliku.
grep
for KILLPID in
ps ax | grep „puma” | grep -v 'grep' | awk „{print $ 1;}” ; do kill -9 $KILLPID; done
usunie grep
możesz użyć następującego polecenia, aby wyświetlić proces
ps aux | grep -c myProcessName
jeśli chcesz sprawdzić liczbę tego procesu, uruchom
ps aux | grep -c myProcessName |grep -v grep
po czym możesz zabić proces za pomocą
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
Jeśli nie chcesz borykać się ze znalezieniem identyfikatora procesu, użyj wyrażenia regularnego, aby zabić proces według nazwy. Na przykład, aby zabić Chrome, poniższy kod załatwi sprawę.
killall -r --regexp chrome
-r
lub --regexp
, które są odpowiednio krótką i długą GNU.
Możesz użyć następującego polecenia, aby:
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
lub
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
Mi to pasuje.
Brzmi źle?
pkill `pidof myprocess`
przykład:
# kill all java processes
pkill `pidof java`
Znalazłem najlepszy sposób, aby to zrobić dla serwera, który nie obsługuje pkill
kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')
Nie musisz zapętlać.
najlepiej i najbezpieczniej skorzystać pgrep -f
z kill
, lub po prostu pkill -f
, grep
ing ps
„s wyjście może się nie udać.
W przeciwieństwie do użycia, ps | grep
z którym musisz odfiltrować linię grep przez dodanie | grep -v
lub użycie sztuczek z wzorami, pgrep
po prostu nie wybierze się z założenia.
Ponadto powinien pojawić Twój wzór w ps
„s UID
/ USER
, SDATE
/ START
lub innej kolumnie, dostaniesz niechcianych procesów w produkcji i ich zabić, pgrep
+ pkill
nie cierpią z powodu tej luki.
również znalazłem, że killall -r
/ -regexp
nie działa z moim wyrażeniem regularnym.
pkill -f "^python3 path/to/my_script$"
Wziąłem odpowiedź Eugena Riecka i pracowałem z nią. Mój kod dodaje:
ps ax
zawiera grep, więc go wykluczyłem grep -Eiv 'grep'
Utworzyłem plik o nazwie killserver
, oto on:
#!/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
Wyniki
➜ myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
➜ myapp git:(master) bash killserver
Didn't kill anything
my_pattern
po prostu jest podciągiem nazwy, czy zawiera jakieś znaki specjalne wyrażenia regularnego?