Wie kann ich einen Prozess mit Namen anstelle von PID beenden?


349

Wenn ich versuche, Firefox zu starten, wird manchmal angezeigt, dass bereits ein Firefox-Prozess ausgeführt wird. Also muss ich das machen:

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

Was ich möchte, ist ein Befehl, der das alles für mich tun würde. Es würde eine Eingabezeichenfolge und grepdafür (oder was auch immer) in der Liste der Prozesse benötigen und alle Prozesse in der Ausgabe beenden:

jeremy@jeremy-desktop:~$ killbyname firefox

Ich habe versucht, es in PHP zu tun, aber es exec('ps aux')scheint nur Prozesse anzuzeigen, mit denen exec()im PHP-Skript selbst ausgeführt wurde (der einzige Prozess, den es zeigt, ist selbst).


Wenn ich das Fenster erhalte, in dem steht, dass Firefox bereits ausgeführt wird, muss ich normalerweise nur eine Sekunde warten und kann Firefox erneut ausführen (dies ist natürlich möglicherweise nicht immer der Fall).
Nuoritoveri

1
Dies ist der sicherste Weg, wie JohnB in dieser Antwort sagt: stackoverflow.com/questions/6381229/…
tecnoshopbq

Mögliches Duplikat von Finden und
Beenden

Dies ist eine alte Frage, aber können Sie bitte die akzeptierte Antwort ändern? Der von Ihnen markierte Fehler schlägt bei vielen Prozessen fehl, z. B. bei den von der JVM ausgeführten.
Luís de Sousa

Für alle, die auf dieses Thema verweisen, verweist Luis im obigen Kommentar auf die Antwort unten, die den pkill -f "Process name"Befehl ankündigt ...
Digger

Antworten:


505
pkill firefox

Weitere Informationen: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Es ist eine gute Sache, mit pgrep herauszufinden, was Sie töten, bevor Sie sich mit dem Töten von Prozessen befassen. Besonders bei der Verwendung -f.
Akrikos

pkill ist nicht sehr freundlich. Sie können es nicht so benennen, wie Killall sie nimmt.
Octopus

2
pkill -U <username>ist sehr praktisch. Ich habe einen Solaris -Webserver, den eigentlichen Webserver-Daemon, der als Dienst mit einem eigenen Benutzer eingerichtet ist. Die Angabe durch den Benutzer ist daher eine einfache Möglichkeit, einen Neustart auszulösen.
Raystorm

6
Um das Töten zu erzwingen: pkill -9 Firefox
Justas

Dies funktioniert bestenfalls halb so oft. Sie benötigen mindestens das -fFlag für eine Omnibus-Lösung.
Luís de Sousa

112

Auch möglich zu verwenden:

pkill -f "Process name"

Für mich hat es perfekt geklappt. Es war das, wonach ich gesucht habe. pkill funktioniert nicht mit Namen ohne Flag.

Wenn -ffestgelegt, wird die vollständige Befehlszeile für den Mustervergleich verwendet.


2
Speziell für etwas mit Wein ist die -fOption wirklich notwendig. zBpkill -f "EvilWindowsServer.exe"
CodeBrauer

Dies sollte die akzeptierte Antwort sein. Die erste Antwort schlägt bei vielen Arten von Programmen fehl, z. B. bei Programmen, die auf einer JVM ausgeführt werden.
Luís de Sousa

1
Ich musste auch das -fFlag hinzufügen, um einen Hintergrundprozess zu beenden, auf dem ein Python-Skript ausgeführt wird.
Mason

In meinem Fall brauchte ich 2 Flaggen:pkill -f -9 PROCESSNAME
Slavik

seine Arbeit in centos7.thank
sirmagid

64

Sie können Prozesse mit Namen mit beendenkillall <name>

killall sendet ein Signal an alle Prozesse, die einen der angegebenen Befehle ausführen. Wenn kein Signalname angegeben ist, wird SIGTERM gesendet.

Signale können entweder durch den Namen (z. B. -HUP oder -SIGHUP ) oder durch die Nummer (z. B. -1 ) oder durch die Option -s angegeben werden .

Wenn der Befehlsname kein regulärer Ausdruck ist (Option -r ) und einen Schrägstrich (/) enthält, werden Prozesse, die diese bestimmte Datei ausführen, unabhängig von ihrem Namen zum Beenden ausgewählt.

Aber wenn Sie den Prozess nicht sehen ps aux, haben Sie wahrscheinlich nicht das Recht, ihn zu töten ...


6
Um das Beenden eines Programms zu erzwingen, das nicht reagiert, senden Sie KILL anstelle von TERM:killall -s KILL firefox
Martin Hansen

45

Eine etwas längere Alternative:

kill `pidof firefox`

25
pidof Firefox | Xargs töten -9
hbt

1
Dieser funktioniert unter Busybox für Ihre eingebetteten Geräte :)
nwgat

25

Am einfachsten ist es, zunächst zu überprüfen, ob Sie die richtigen Prozess-IDs erhalten mit:

pgrep -f [part_of_a_command]

Wenn das Ergebnis wie erwartet ist. Geh mit:

pkill -f [part_of_a_command]

19

Seltsam, aber ich habe die Lösung so nicht gesehen:

kill -9 `pidof firefox`

Es kann auch mehrere Prozesse (mehrere Pids) wie:

kill -9 `pgrep firefox`

Ich bevorzuge, pidofda es eine einzeilige Ausgabe hat:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Wenn ich das ausführe, habe ich den Fehler bekommen kill: invalid number 'pidof myprogram'. Was ist hier drin schlecht?
Brethlosze

Das hat mir heute das Leben gerettet ... Ich möchte nicht mehr schreiben, aber ich bin froh, dass ich es hier gefunden habe. Danke, Mann.
MilMike

1
Sie kommen zu spät, aber falls sich jemand anderes wundert ... @Brethlosze setzen Sie einzelne Ticks, während der Befehl Backticks erfordert.
Spektren

Danke! .. ich werde (und ich bin) über diese Backticks informiert sein :)
Brethlosze

13

Beenden Sie alle Prozesse snippetim Startpfad. Sie können alle Apps beenden, die aus einem Verzeichnis gestartet wurden, indem Sie / directory / als Snippet einfügen. Dies ist sehr nützlich, wenn Sie mehrere Komponenten für dieselbe Anwendung aus demselben App-Verzeichnis starten.

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

* Ich würde pgrep bevorzugen, wenn verfügbar


1
Dies ist eine häufig vorkommende Kombination von Antimustern. Verwenden Sie einen regulären Ausdruck, der nicht mit sich selbst (oder dem Namen des enthaltenen Skripts) übereinstimmt, und vermeiden Sie einen nutzlosen Ausdruckgrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
Tripleee

1
Während Sie nutzloses grep vermeiden, vermeiden Sie Tippfehler und die Fähigkeit, den Befehl in automatisierten Prozessen zu verwenden, die das <Snippet> parametrisieren
Mike

Dies ist in der Tat der beste Weg, um es zu tun!
Abhinandan Dubey

Wäre es toll zu verstehen, warum @ Tripleees [s]funktioniert, wenn es darum geht, nicht mit dem awk-Prozess selbst übereinzustimmen ?
andig

Weil der Regex [x]ymit der Zeichenfolge übereinstimmt, xyaber nicht umgekehrt. Dies ist eine häufige FAQ. Der Link verweist auf eine Seite von vor mehr als 20 Jahren, auf der dies ausführlicher erläutert wird. und das war schon damals eine wiederkehrende Frage.
Tripleee

11

Auf dem Mac konnte ich weder pgrep noch pkill finden, noch funktionierte killall, also schrieb ich ein einfaches Einzeilenskript: -

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

Wenn es einen einfacheren Weg gibt, teilen Sie dies bitte mit.


1
Lol. Dies ist ein verrückter Befehl für eine solche Aufgabe. Keine Ursache. Haben Sie diese einfache Zeile angerufen? : D Einfach ist killall
m3nda

@ erm3nda :-) Stimme zu. Rückblickend sieht es verrückt aus. Ich kann mich nicht erinnern, warum Killall damals auf meinem Mac nicht funktioniert hat.
Dhiraj

Dies ist sehr nützlich, wenn Sie einen bestimmten Java-Prozess wie "jboss" beenden möchten. In diesem Fall hilft killall nicht.
Jan M


6

Mit grep töten:

kill -9 `pgrep myprocess`

5

richtiger wäre:

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

1
Warum verwenden Sie exporteine Variable, die Sie im selben Prozess nur einmal verwenden werden?
Tripleee


3

Ich habe mir die gleiche Frage gestellt, aber das Problem mit den aktuellen Antworten ist, dass sie die abzubrechenden Prozesse nicht sicher überprüfen, so dass ... dies zu schrecklichen Fehlern führen kann :) ... insbesondere wenn mehrere Prozesse dem Muster entsprechen .

Als Haftungsausschluss bin ich kein Sh-Profi und es gibt sicherlich Raum für Verbesserungen.

Also habe ich ein kleines sh-Skript geschrieben:

#!/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

Wenn Sie GNOME ausführen, können Sie den Systemmonitor (System-> Administration-> Systemmonitor) verwenden, um Prozesse wie unter Windows abzubrechen. KDE wird etwas Ähnliches haben.


2

Der Standardbefehl killakzeptiert Befehlsnamen als Alternative zur PID. Siehe kill (1) . Ein häufig auftretendes Problem besteht darin, dass es basheigene Namen bereitstellt, killdie Jobnummern wie kill %1, aber keine Befehlsnamen akzeptieren . Dies behindert den Standardbefehl. Wenn die erstere Funktionalität für Sie nützlicher ist als die letztere, können Sie die bashVersion durch Aufrufen deaktivieren

enable -n kill

Weitere Informationen finden Sie unter killund enableEinträge in bash (1) .


Wie kann ich die Aktion wieder aktivieren enable -n kill?
Brethlosze

1
@hyprfrcbenable kill
The Vee



0

awk oneliner, der den Header der psAusgabe analysiert , sodass Sie sich nicht um Spaltennummern (sondern um Spaltennamen) kümmern müssen. Unterstützt Regex. Um beispielsweise alle Prozesse abzubrechen, deren ausführbarer Name (ohne Pfad) das Wort "Firefox" enthält, versuchen Sie es

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.*
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.