Jak mogę zabić proces według nazwy zamiast PID?


349

Czasami, gdy próbuję uruchomić Firefoksa, mówi „proces Firefox już działa”. Więc muszę to zrobić:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

To, co chciałbym, to polecenie, które zrobiłoby to wszystko dla mnie. Pobierałby ciąg wejściowy i grepdla niego (lub cokolwiek innego) na liście procesów, i zabiłby wszystkie procesy na wyjściu:

jeremy@jeremy-desktop:~$ killbyname firefox

Próbowałem to zrobić w PHP, ale exec('ps aux')wydaje się, że pokazuje tylko procesy, które zostały wykonane exec()w samym skrypcie PHP (więc jedynym pokazanym procesem jest sam).


Kiedy pojawia się okno z informacją, że Firefox już działa, zwykle muszę tylko poczekać sekundę i mogę ponownie uruchomić Firefoksa (oczywiście nie zawsze tak jest).
nuoritoveri

1
Jest to najbezpieczniejszy sposób, jak mówi JohnB w tej odpowiedzi: stackoverflow.com/questions/6381229/…
tecnoshopbq


To stare pytanie, ale czy mógłbyś zmienić przyjętą odpowiedź? Ten, który zaznaczyłeś, kończy się niepowodzeniem w przypadku wielu procesów, takich jak te uruchomione przez JVM.
Luís de Sousa,

Dla każdego, kto odwołuje się do tego tematu, w powyższym komentarzu, Luis odnosi się do poniższej odpowiedzi, która reklamuje pkill -f "Process name"polecenie ...
Digger

Odpowiedzi:


505
pkill firefox

Więcej informacji: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Używanie pgrep, aby dowiedzieć się, co zabijasz, zanim przejdziesz przez proces zabijania, jest dobrą rzeczą. Zwłaszcza podczas używania -f.
Akrikos

pkill nie jest bardzo przyjazny. nie możesz nazwać tego w ten sam sposób, w jaki zabierają je wszyscy.
Octopus,

2
pkill -U <username>jest całkiem przydatny. Mam serwer internetowy Solaris , rzeczywisty demon serwera WWW, jest skonfigurowany jako usługa z własnym użytkownikiem. Określenie przez użytkownika jest prostym / łatwym sposobem na uruchomienie ponownego uruchomienia.
Raystorm,

6
Aby wymusić zabicie: pkill -9 firefox
Justas

Działa to co najwyżej pół razy. Potrzebujesz przynajmniej -fflagi dla rozwiązania zbiorczego.
Luís de Sousa,

112

Możliwe również użycie:

pkill -f "Process name"

Dla mnie zadziałało idealnie. Tego właśnie szukałem. pkill nie działa z nazwą bez flagi.

Po -fustawieniu do dopasowania wzorca używany jest pełny wiersz polecenia.


2
specjalnie do biegania coś z winem-f jest naprawdę potrzebna opcja. np.pkill -f "EvilWindowsServer.exe"
CodeBrauer

To powinna być zaakceptowana odpowiedź. Pierwsza odpowiedź kończy się niepowodzeniem w przypadku wielu rodzajów programów, np. Działających na JVM.
Luís de Sousa,

1
Musiałem także dodać -fflagę, aby zabić proces działający w tle z uruchomionym skryptem Python.
Mason

w moim przypadku potrzebowałem 2 flag:pkill -f -9 PROCESSNAME
Slavik,

64

Możesz zabijać procesy według nazwy za pomocąkillall <name>

killall wysyła sygnał do wszystkich procesów uruchamiających dowolne z określonych poleceń. Jeśli nie podano nazwy sygnału, wysyłany jest SIGTERM.

Sygnały można określić albo według nazwy (np. -HUP lub -SIGHUP ), albo według liczby (np. -1 ), albo według opcji -s .

Jeśli nazwa polecenia nie jest wyrażeniem regularnym (opcja -r ) i zawiera ukośnik (/), procesy wykonujące ten konkretny plik zostaną wybrane do zabicia, niezależnie od ich nazwy.

Ale jeśli nie widzisz tego procesu ps aux, prawdopodobnie nie będziesz miał prawa go zabić ...


6
Aby wymusić zakończenie programu, który nie odpowiada, wyślij KILL zamiast TERM:killall -s KILL firefox
Martin Hansen

45

Nieco dłuższa alternatywa:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
ten działa pod busybox dla urządzeń osadzonych :)
nwgat

25

Najłatwiejszym sposobem jest sprawdzenie, czy otrzymujesz właściwe identyfikatory procesów za pomocą:

pgrep -f [part_of_a_command]

Jeśli wynik jest zgodny z oczekiwaniami. Iść z:

pkill -f [part_of_a_command]

19

Dziwne, ale nie widziałem takiego rozwiązania:

kill -9 `pidof firefox`

może także zabić wiele procesów (wiele pid), takich jak:

kill -9 `pgrep firefox`

Wolę, pidofponieważ ma jedno wyjście liniowe:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Kiedy to wykonuję, pojawia się błąd kill: invalid number 'pidof myprogram'. Co tu jest złego ?.
Brethlosze,

to właśnie uratowało mi dziś życie ... Nie chcę pisać więcej, ale cieszę się, że znalazłem to tutaj. dzięki stary.
MilMike,

1
Spóźniamy się, ale na wypadek, gdyby ktoś jeszcze się zastanawiał… @Brethlosze stawiasz pojedyncze tyknięcia, podczas gdy komenda wymaga wykonania tykania.
spectras

Dzięki! .. będę (i będę) świadomy tych backticków :)
Brethlosze,

13

Zabij wszystkie procesy znajdujące się snippetna ścieżce uruchamiania. Możesz zabić wszystkie aplikacje uruchomione z jakiegoś katalogu, umieszczając / katalog / jako fragment kodu. Jest to bardzo przydatne, gdy uruchamiasz kilka komponentów dla tej samej aplikacji z tego samego katalogu aplikacji.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Wolę pgrep, jeśli jest dostępny


1
Jest to często spotykana kombinacja antypatternów. Użyj wyrażenia regularnego, które nie pasuje do siebie (lub nazwy zawierającego skrypt) i unikaj niepotrzebnegogrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee

1
unikając bezużytecznego grepa, nie unika się literówek i możliwości używania polecenia w zautomatyzowanych procesach, które parametryzują <fragment kodu>
Mike

TO jest rzeczywiście najlepszy sposób, aby to zrobić!
Abhinandan Dubey,

Byłoby wspaniale zrozumieć, dlaczego @ tripleee [s]działa pod względem niedopasowania samego procesu awk?
andig

Ponieważ wyrażenie regularne [x]ypasuje do ciągu, xyale nie odwrotnie. To często zadawane pytania. Link prowadzi do strony sprzed ponad 20 lat, która wyjaśnia to bardziej szczegółowo; i to było już powtarzające się pytanie.
tripleee

11

Na Macu nie mogłem znaleźć pgrep i pkill, ani też killall nie działał, więc napisałem prosty skrypt liniowy: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Jeśli jest to łatwiejszy sposób, udostępnij.


1
Lol. To szalone polecenie do takiego zadania. Nieważne. Czy nazwałeś tę prostą jedną linię? : D Simple is killall
m3nda

@ erm3nda :-) Zgadzam się. Patrząc wstecz, wygląda na szalone. Nie mogę sobie przypomnieć, dlaczego killall nie działał wtedy na moim komputerze Mac.
Dhiraj

Jest to bardzo przydatne, gdy chcesz zabić pewien proces Java, taki jak „jboss”. W takim przypadku killall nie pomaga.
Jan M



5

bardziej poprawne byłoby:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
Dlaczego jesteś exportzmienną, której będziesz używać tylko raz w tym samym procesie?
tripleee


3

Zadawałem sobie to samo pytanie, ale problem z obecnymi odpowiedziami polega na tym, że nie sprawdzają bezpiecznie procesów, które mają zostać zabite, więc ... może to prowadzić do strasznych błędów :) ... zwłaszcza, jeśli kilka procesów pasuje do wzorca .

Jako wyłączenie odpowiedzialności nie jestem zawodowcem i na pewno jest miejsce na ulepszenia.

Więc napisałem mały skrypt sh:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

Jeśli korzystasz z GNOME, możesz użyć monitora systemu (System-> Administracja-> Monitor systemu), aby zabić procesy tak jak w Windows. KDE będzie miało coś podobnego.


2

Domyślne killpolecenie akceptuje nazwy poleceń jako alternatywę dla PID. Zobacz kill (1) . Często występującym problemem jest to, że bashudostępnia własny, killktóry akceptuje numery zadań, takie jak kill %1, ale nie nazwy poleceń. Utrudnia to domyślne polecenie. Jeśli pierwsza funkcja jest dla Ciebie bardziej przydatna niż druga, możesz wyłączyć bashwersję, dzwoniąc

enable -n kill

Aby uzyskać więcej informacji, zobacz killi enablewpisy w bash (1) .


Jak mogę ponownie włączyć działanie enable -n kill?
Brethlosze,

1
@hyprfrcbenable kill
The Vee



0

awk oneliner, który analizuje nagłówek danych pswyjściowych, więc nie musisz się przejmować numerami kolumn (tylko nazwami kolumn). Obsługa wyrażenia regularnego. Na przykład, aby zabić wszystkie procesy, których nazwa pliku wykonywalnego (bez ścieżki) zawiera słowo „firefox” spróbuj

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.