Jak zabić wszystkie procesy o podanej częściowej nazwie? [Zamknięte]

621

Chcę zabić wszystkie procesy, które otrzymuję:

ps aux | grep my_pattern

Jak to zrobić?

To nie działa:

pkill my_pattern
Łukasz Lew
źródło
11
Czy my_patternpo prostu jest podciągiem nazwy, czy zawiera jakieś znaki specjalne wyrażenia regularnego?
Sven Marnach

Odpowiedzi:

1316

Użyj pkill -f, która pasuje do wzorca dla dowolnej części wiersza poleceń

pkill -f my_pattern
Dor Shemer
źródło
7
@Jayan: zabijanie jest również dość bezkrytyczne. Zaskakująco łatwo jest
zlekceważyć
1
@Jayan: nie przekonasz mnie :-). Zbyt wiele razy spłonęły mnie skrypty innych firm, które nalegały na użycie pkill- najczęstszym błędem jest założenie, że w danym momencie może istnieć tylko jedna instancja każdego pliku binarnego.
thkala
4
Dla wszystkich użytkowników komputerów Mac, którzy znaleźli tę odpowiedź, tak jak ja, odpowiednikiem komputera Mac jest killall -m my_pattern.
Zev Eisenberg
1
Jeśli masz wiele wiszących procesów, które się nie zabijają, użyj pkill -f -9, aby bezlitośnie je zabić
MacK
18
Polecam pgrepnajpierw użyć do sprawdzenia, co zamierzasz zabić. Możesz użyć, pgrep -laby zobaczyć nazwy procesów lub pgrep -azobaczyć pełne wiersze poleceń. Używa tych samych flag co pkill. Więc w tym przypadku możesz użyć pgrep -fa my_pattern.
studgeek
158

Zabij wszystkie procesy pasujące do ciągu „myProcessName”:

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

Źródło: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Co robi ten kod?

ps -efTworzy listę identyfikatorów proces na komputerze widocznym dla tego użytkownika. Grep potoku odfiltrowuje to dla wierszy zawierających ten ciąg. grep -v grepMó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.

  1. 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 killczęść przesłaną flagą, która żąda płynnego zamknięcia, i tylko w przypadku odrzucenia tego żądania, w ostatecznościkill -9

  2. 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 -efzawiera 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.

Eric Leschinski
źródło
15
Spowoduje to błąd, jeśli nie zostanie znaleziony żaden proces pasujący do nazwy. Możesz użyć, ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9aby xargs nie wykonywał polecenia, jeśli nie podano żadnych argumentów.
Epigene
2
Drobna modyfikacja, być może lepiej jest podać nazwę procesu: 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ę.
Ali Haider
-ropcja nie istnieje w OS X, więc wydaje się.
Danijel,
52

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.

Eugen Rieck
źródło
4
-1 Nie potrzebujesz pętli, możesz po prostu 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).
tripleee
11
@tripleee Nie ma problemu z downvote, ale zrobić sobie sprawę, że, że OQ było „Chcę zabić wszystkie procesy, które ja dostać przez: ps aux | grep my_pattern” , który ja dutyfully zaakceptowany.
Eugen Rieck,
Kill zabije wszystkie procesy za jednym razem, nie potrzebujesz do tego pętli. Jeśli pszwróci trzy procesy 123, 234 i 345, możesz kill 123 234 345tak jak możesz rmlub catwiele argumentów pliku.
tripleee
@tripleee Mam na myśli usunięciegrep
Eugen Rieck
for KILLPID in ps ax | grep „puma” | grep -v 'grep' | awk „{print $ 1;}” ; do kill -9 $KILLPID; doneusunie grep
Justin E
18

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 }') 
Nived Thanima
źródło
możesz użyć następującego polecenia, aby wyświetlić proces ps aux | grep -c nazwa_procesu, jeśli chcesz sprawdzić liczbę tego procesu, uruchom ps aux | grep -c nazwa_procesu | grep -v grep, po którym możesz zabić proces za pomocą kill -9 $ (ps aux | grep -e moja_procesa | awk '{print $ 2}')
Nived Thanima
13

Możesz także użyć killall -r my_pattern. -rInterpretuj wzorzec nazwy procesu jako rozszerzone wyrażenie regularne.

killall -r my_pattern
Alex
źródło
8

Jeśli uważasz, że jest pkill -f PATTERNto zbyt niebezpieczne, napisałem ezkill skrypt bash, który zachęca cię do wybrania procesów spośród tych, które pasują do WZORU, który chcesz zabić.

kraymer
źródło
7

Możesz użyć następującego polecenia do

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
Alex Liu
źródło
4

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

ajaz
źródło
1
Potrzebujesz tylko jednego -r lub --regexp , które są odpowiednio krótką i długą GNU.
BigSmoke,
3

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.

Luis Lopes
źródło
1
Witamy w StackOverflow. Użyj linii 4-spacji lub wcięcia dla linii kodu, aby były sformatowane jako bloki kodu. Z pozdrowieniami
JakowL,
2

Brzmi źle?

 pkill `pidof myprocess`

przykład:

# kill all java processes
pkill `pidof java`
użytkownik6482587
źródło
2

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ć.

Magige Daniel
źródło
1

najlepiej i najbezpieczniej skorzystać pgrep -fz kill, lub po prostu pkill -f, greping ps„s wyjście może się nie udać.

W przeciwieństwie do użycia, ps | grepz którym musisz odfiltrować linię grep przez dodanie | grep -vlub użycie sztuczek z wzorami, pgreppo prostu nie wybierze się z założenia.

Ponadto powinien pojawić Twój wzór w ps„s UID/ USER, SDATE/ STARTlub innej kolumnie, dostaniesz niechcianych procesów w produkcji i ich zabić, pgrep+ pkillnie 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$"

man pkill

Wis
źródło
0

Wziąłem odpowiedź Eugena Riecka i pracowałem z nią. Mój kod dodaje:

  1. ps ax zawiera grep, więc go wykluczyłem grep -Eiv 'grep'
  2. Dodano kilka ifs i ech, aby był czytelny dla człowieka.

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
Meir Gabay
źródło
0

To jest sposób:

kill -9 $(pgrep -d' ' -f chrome)
MadMad666
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Igor F.