@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 -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.
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
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.
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
-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
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.
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ć.
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ę.
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.
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.
my_pattern
po prostu jest podciągiem nazwy, czy zawiera jakieś znaki specjalne wyrażenia regularnego?Odpowiedzi:
Użyj
pkill -f
, która pasuje do wzorca dla dowolnej części wiersza poleceńźródło
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 lubpgrep -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
.Zabij wszystkie procesy pasujące do ciągu „myProcessName”:
Ź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 -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ówkill -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.
źródło
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
Możesz użyć grep -e itp.
źródło
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żeszkill 123 234 345
tak jak możeszrm
lubcat
wiele argumentów pliku.grep
for KILLPID in
ps ax | grep „puma” | grep -v 'grep' | awk „{print $ 1;}”; do kill -9 $KILLPID; done
usunie grepmożesz użyć następującego polecenia, aby wyświetlić proces
jeśli chcesz sprawdzić liczbę tego procesu, uruchom
po czym możesz zabić proces za pomocą
źródło
Możesz także użyć
killall -r my_pattern
.-r
Interpretuj wzorzec nazwy procesu jako rozszerzone wyrażenie regularne.źródło
Jeśli uważasz, że jest
pkill -f PATTERN
to 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ć.źródło
Możesz użyć następującego polecenia do
źródło
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ódło
-r
lub--regexp
, które są odpowiednio krótką i długą GNU.Możesz użyć następującego polecenia, aby:
lub
Mi to pasuje.
źródło
Brzmi źle?
przykład:
źródło
Znalazłem najlepszy sposób, aby to zrobić dla serwera, który nie obsługuje
pkill
Nie musisz zapętlać.
źródło
najlepiej i najbezpieczniej skorzystać
pgrep -f
zkill
, lub po prostupkill -f
,grep
ingps
„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
„sUID
/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$"
man pkill
źródło
Wziąłem odpowiedź Eugena Riecka i pracowałem z nią. Mój kod dodaje:
ps ax
zawiera grep, więc go wykluczyłemgrep -Eiv 'grep'
Utworzyłem plik o nazwie
killserver
, oto on:Wyniki
źródło
To jest sposób:
źródło