
Die Linux-Befehlszeile bietet verschiedene Befehle zum Beenden eines Prozesses. Beispielsweise kann der Befehl „kill“ verwendet werden, um einen Prozess zu beenden, indem seine PID als Argument übergeben wird, der Befehl „pkill“ nimmt ein Muster als Eingabe und alle passenden laufenden Prozesse werden beendet. Aber es gibt einen Befehl 'killall', der standardmäßig genau mit dem Argumentnamen übereinstimmt und den passenden Prozess beendet.
In diesem Artikel werden wir diesen Befehl anhand einiger praktischer Beispiele besprechen. Der Befehl killall kann verwendet werden, um ein Signal an einen bestimmten Prozess zu senden, indem sein Name verwendet wird. Das heißt, wenn Sie fünf Versionen desselben Programms laufen haben, wird der Befehl killall alle fünf beenden.
Das Signal kann als Argument für diesen Befehl oder SIGTERM angegeben werden wird standardmäßig gesendet. Ein Prozess kann untergeordnete Prozesse erzeugen, die unabhängig vom übergeordneten Prozess sind, was bedeutet, dass jeder Unterprozess durch seine PID identifiziert wird. Mit dem Befehl kill verwenden wir die PID, um den zu beendenden Unterprozess auszuwählen, aber mit dem Befehl killall werden alle Prozesse beendet, indem wir den Namen angeben, da alle Unterprozesse und der übergeordnete Prozess denselben Namen haben.
Lassen Sie uns die Verwendung des Killall-Befehls anhand einiger praktischer Beispiele diskutieren.
1) Alle unterstützten Signale auflisten
Der Kill-Befehl unterstützt einige Signale, die mit -l
aufgelistet werden können Möglichkeit. killall sendet Signale an Prozesse. Sie können das -s
verwenden Option (gefolgt vom Signalnamen), um ein bestimmtes Signal an einen Prozess zu senden.
$ killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
Standardmäßig SIGTERM/TERM (15) wird an den Prozess gesendet, wenn kein Signal an den Killall-Befehl gegeben wird. Die obigen Signale werden sowohl von Benutzern als auch von Systemadministratoren sinnvoll verwendet. killall unterstützt also all diese Signale.
2) Einen bestimmten Prozess beenden
Um einen Prozess zu beenden, müssen wir ihn identifizieren, um zu prüfen, ob er läuft. Wir können einen bestimmten Prozess anhand seines Namens beenden. Angenommen, es gibt zwei Prozesse, die dieselben Anfangsbuchstaben haben:
$ ps -aef | grep "test"
himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again
Nun, hier ist, wie Sie den Befehl killall verwenden können, um 'test_again' zu beenden:
$ killall test_again
[2]+ Terminated ./test_again
Wie Sie sehen können, hat der killall-Befehl den „test_again“-Prozess beendet. Dies kann auch durch den Befehl ps bestätigt werden :
$ ps -aef | grep "test"
himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
Beachten Sie, dass 'test_again' nicht in der Ausgabe angezeigt wird, da es beendet wird.
3) Beenden Sie einen Prozess, der die Groß-/Kleinschreibung ignoriert
Beim Befehl killall wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Hier ist ein Beispiel:
$ ps -aef | grep "test"
himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test
himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again
himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test
Sie können sehen, dass alle unsere Prozesse in Kleinbuchstaben geschrieben sind. Lassen Sie uns versuchen, den "./test"-Prozess zu beenden, aber wir geben den Namen in Großbuchstaben
ein$ killall TEST
TEST: no process found
Sie können also sehen, dass der killall-Befehl keinen Prozess namens TEST finden konnte, während ein Prozess namens „test“ bereits läuft. Um sicherzustellen, dass der Befehl killall die Groß-/Kleinschreibung ignoriert, verwenden Sie das -I
Möglichkeit. Hier ist ein Beispiel:
$ killall -I TEST
[1]- Terminated ./test
Beachten Sie, dass der 'Test'-Prozess jetzt erfolgreich beendet wurde.
4) Prozesse mit Bestätigung beenden
Der Befehl killall kann verwendet werden, um mehr als einen Prozess zu beenden.
$ killall test test_again
[2]- Terminated ./test_again
[3]+ Terminated ./test
Es kann jedoch vorkommen, dass beim Einfügen des Prozessnamens ein Fehler gemacht wird, indem ein anderer Name angegeben wird. Es kann ein ernsthaftes Problem sein, wenn der angezeigte Prozess ein kritischer Prozess für das System ist. Es wird daher empfohlen, killall zu verwenden, um Prozesse interaktiv zu beenden, indem Sie nach einer Bestätigung fragen. Dazu können Sie das -i
verwenden Option.
$ killall -i test test_again
Kill test(4201) ? (y/N) y
Kill test_again(4202) ? (y/N) y
[1]- Terminated ./test
[2]+ Terminated ./test_again
Sie können also sehen, dass der Benutzer auf diese Weise die Beendigung von Prozessen mit dem Befehl killall steuern kann.
5) Prozess leise beenden
Manchmal, wenn killall einen bestimmten Prozess nicht finden kann, beschwert es sich in der Ausgabe darüber.
Hier ist ein Beispiel:
$ killall TEST
TEST: no process found
Aber falls Sie möchten, dass killall seine Arbeit leise erledigt, können Sie das -q
verwenden Möglichkeit:
$ killall -q TEST
$
Sie können also sehen, dass bei Verwendung von -q die Ausgabe unterdrückt wurde.
6) Ein seltsames Ergebnis des Killall-Befehls
Die Manpage des Befehls killall besagt, dass er standardmäßig nur dann mit vollständigen Namen übereinstimmt, wenn sie weniger als oder gleich 15 Zeichen lang sind. Wenn also ein Befehlsname länger als 15 Zeichen ist, ist der vollständige Name möglicherweise nicht verfügbar (d. h. er wird ausgetauscht). In diesem Fall killall tötet alles, was innerhalb der ersten 15 Zeichen passt.
Angenommen, es gibt die folgenden zwei Prozesse mit langen Namen:
$ ps -aef | grep "test"
himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij
himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh
Der erste Prozess in der obigen Ausgabe hat genau 15 Zeichen im Namen. Versuchen wir es mit dem Befehl killall zu beenden :
$ killall test_abcdefghij
[1]- Terminated ./test_abcdefghij
Sie können also sehen, dass der Befehl killall den Prozess erfolgreich beendet.
Nun, laut Manpage, wenn beide Namen mehr als 15 übereinstimmende Zeichen gehabt hätten, hätte killall Prozesse beendet, bei denen auf den Namen -e
folgt Option oder es wird alles töten, was innerhalb der ersten 15 Zeichen passt. Hier ist ein Beispiel:
$ ps -aef | grep "test"
himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz
himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test
Beachten Sie, dass beide Prozesse jetzt mehr als 15 übereinstimmende Zeichen in ihrem Namen haben. Als ich nun versuchte, den zweiten Prozess mit killall zu beenden:
$ killall test_abcdefghijklmnopqrstuvwxyz
[6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz
Es hat nur den angegebenen Prozess beendet und nicht auch den zweiten Prozess
$ ps -aef | grep "test"
himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test
Ich bin mir nicht sicher, ob auf meiner Seite etwas nicht stimmt oder ob es sich um einen Fehler im Killall-Befehl handelt. Ich würde mich freuen, wenn Sie Ihre Meinung dazu in Kommentaren darlegen.
Übrigens, hier sind die Details des killall-Befehls auf meinem System:
$ killall --version
killall (PSmisc) 22.20
Copyright (C) 1993-2012 Werner Almesberger and Craig Small
PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.
Schlussfolgerung
Ab Centos 7 wird empfohlen, pkill anstelle von killall auszuführen, sodass Sie möglicherweise standardmäßig den Fehler „killall:command not found“ erhalten, wenn Sie den Befehl ausführen. Wenn Sie es immer noch möchten, installieren Sie pkill, indem Sie das psmisc-Paket hinzufügen (# yum install psmisch).
Killall ist hilfreich, weil wir einen Prozess anhand seines Namens beenden können, selbst wenn wir uns nicht an seine PID erinnern können. Es hat einige Optionen nicht, weil es relativ einfach zu bedienen ist.
Lesen Sie auch:
- Wie man einen Prozess vom Linux-Terminal beendet
- fkill - Interaktives Tool zum Beenden von Prozessen unter Linux