Der Befehl kill in Linux: So beenden Sie nicht reagierende Prozesse sicher
Linux ist stabil, doch auch hier frieren Anwendungen ein. Wenn das passiert, kann ein hängender Prozess weiterlaufen und CPU oder Arbeitsspeicher verbrauchen, wodurch das gesamte System langsamer wird. Ein Neustart hilft zwar, ist auf Produktionsservern aber langsam und störend. Deshalb ist der Befehl kill in Linux ein zentrales Werkzeug für Administratoren.
Wenn ein Programm hängt, behandelt Linux es weiterhin als aktiv. Anstatt alles neu zu starten, können Sie gezielt nur den problematischen Prozess ansprechen. Der Befehl kill in Linux sendet ein Signal an diesen Prozess und beendet ihn. So stellen Sie die Stabilität schnell und mit minimalen Unterbrechungen wieder her.
Prozesse und Prozess-IDs (PIDs)
Ein Prozess ist eine Instanz eines Programms, das gerade auf dem System läuft. Jedem Prozess wird beim Start eine eindeutige Prozess-ID, kurz PID, zugewiesen. Sobald der Prozess endet, wird seine PID freigegeben und kann später vom System erneut vergeben werden. Die PID zu kennen ist entscheidend, wenn Sie eine fehlerhafte Anwendung präzise ansprechen und beenden möchten.
Um eine PID zu ermitteln, bietet Linux mehrere integrierte Werkzeuge. Der Befehl top zeigt eine Echtzeitliste aller aktiven Prozesse samt Ressourcenverbrauch an, sodass sich problematische Prozesse leicht erkennen lassen. Ein weiterer gängiger Ansatz ist der Befehl ps, der sich mit verschiedenen Optionen kombinieren lässt, um genau den benötigten Prozess zu filtern und zu finden, bevor Sie einen Prozess in Linux sicher und effizient beenden:
[root@host ~]# ps faux | grep systemd
root 1 0.0 0.6 96656 11260 ? Ss Jan24 0:08 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root 533 0.0 1.3 125588 22832 ? Ss Jan24 0:25 /usr/lib/systemd/systemd-journald
root 564 0.0 0.5 107440 9248 ? Ss Jan24 0:00 /usr/lib/systemd/systemd-udevd
Dbus 684 0.0 0.3 73540 5524 ? Ss Jan24 0:06 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 743 0.0 0.4 95736 7760 ? Ss Jan24 0:01 /usr/lib/systemd/systemd-logind
root 66199 0.0 0.0 12108 1060 pts/0 S+ 08:28 0:00 \_ grep --color=auto systemd
root 66153 0.0 0.5 93212 9472 ? Ss 08:27 0:00 /usr/lib/systemd/systemd --user
[root@host ~]#
[root@host ~]# ps -eo user,pid,command | grep systemd
root 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root 533 /usr/lib/systemd/systemd-journald
root 564 /usr/lib/systemd/systemd-udevd
dbus 684 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 743 /usr/lib/systemd/systemd-logind
root 66153 /usr/lib/systemd/systemd --user
root 66213 grep --color=auto systemd
[root@host ~]#
Sie können die PID auch mit den Befehlen pidof process_name oder pgrep process_name ermitteln. Beide geben schnell die Prozess-ID zurück, die zu einem bestimmten Anwendungsnamen gehört:
[root@host ~]# pidof systemd
66156 66153 1
[root@host ~]#
[root@host ~]# pgrep systemd
1
533
564
743
66153
[root@host ~]#
Um ein außer Kontrolle geratenes Programm zu stoppen, verwenden Administratoren den Linux-Befehl kill. Dieses integrierte Werkzeug sendet ein Signal an eine bestimmte PID (oder einen Job), damit das Betriebssystem den Zielprozess beenden, anhalten oder fortsetzen kann. Wenn Sie sich fragen, wie Sie einen Prozess in Linux beenden, ist der erste Schritt immer derselbe: Ermitteln Sie die PID und senden Sie dann mit dem Linux-Befehl kill das passende Signal.
kill-Signale verstehen
Signale sind kurze Nachrichten, die vom Kernel, von einem anderen Prozess oder vom Prozess selbst an einen Prozess gesendet werden. Jedes Signal hat eine vordefinierte Aktion (Disposition), zum Beispiel:
Term: terminate
Ign: ignore
Core: terminate and create a core dump
Stop: pause execution
Cont: resume execution
In den meisten Fällen sendet der Linux-Befehl kill zunächst eine Anfrage zur geordneten Beendigung und eskaliert nur, wenn sich der Prozess weigert zu stoppen. Linux unterstützt bis zu 64 Signale: 1-31 sind Standardsignale, der Rest sind Echtzeitsignale. Standardsignale werden nicht in eine Warteschlange gestellt, während Echtzeitsignale in eine Warteschlange gestellt und der Reihe nach zugestellt werden.
Um Signale und ihre Nummern aufzulisten, führen Sie kill -l aus oder sehen Sie in man 7 signal nach. Wenn Sie Signale verstehen, können Sie den Linux-Befehl kill korrekt einsetzen, Unterbrechungen minimieren und hängende Prozesse mit dem Linux-Befehl kill sauber beheben.
Eine vollständige Liste der Signale erhalten Sie, indem Sie kill -l ausführen oder das Signal-Handbuch mit man 7 signal aufrufen:
[root@host ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT
7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+641) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
[root@host ~]#
Viele Signale haben eine Standardaktion, doch Programme können diese überschreiben, indem sie einen Handler definieren (das Signal „abfangen“). Hat ein Prozess keinen Handler, gilt das Standardverhalten. Bei manchen Signalen bedeutet das, dass sie ignoriert werden. Zwei Ausnahmen sind SIGKILL und SIGSTOP: Sie können weder abgefangen noch blockiert oder ignoriert werden. SIGTERM kann behandelt oder ignoriert werden, sodass eine hartnäckige Anwendung nach einer SIGTERM-Anfrage weiterlaufen kann. Dann eskalieren Sie und senden SIGKILL, um sie sofort zu beenden. Verwenden Sie SIGKILL sparsam, da es Aufräumarbeiten verhindert und temporäre Dateien zurücklassen kann.
Im folgenden Beispiel schlägt kill -15 fehl, daher erzwingt Linux die Beendigung:
[root@host ~]# ps -eo user,pid,command | grep java
tomcat 59815 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start
root 66401 grep --color=auto java
[root@host ~]# kill -15 59815
[root@host ~]#
Wie verwenden Sie den Linux-Befehl kill?
Mit dem Linux-Befehl kill können Sie Signale an Prozesse senden. Dabei gelten einige wichtige Regeln zu Berechtigungen und PIDs. Im Allgemeinen kann ein normaler Benutzer nur Signale an Prozesse senden, die ihm gehören, während der Benutzer root Signale an jeden Prozess im System senden kann.
Wie sich der Linux-Befehl kill verhält, hängt von der angegebenen PID (oder einem PID-ähnlichen Wert) ab:
PID > 0 - sends the chosen signal to the single process with that PID.
PID = 0 - targets every process in the current shell's process group (PGID).
PID = -1 - targets all processes that share the same user ID as the user running the command (use with caution).
PID < -1 - targets the process group whose PGID equals the absolute value of the number.
Wie lautet die Syntax des Linux-Befehls kill und wie wird er grundsätzlich verwendet?
Standardmäßig sendet der Linux-Befehl kill SIGTERM, das eine geordnete Beendigung anfordert und dem Programm Gelegenheit zum Aufräumen gibt. Wenn der Prozess SIGTERM ignoriert oder behandelt und weiterläuft, können Sie es mit einem anderen Signal erneut versuchen.
Sie können Signale in mehreren Formaten angeben:
By number: kill -9 <PID>
With SIG prefix: kill -SIGKILL <PID>
Without SIG prefix: kill -KILL <PID>
In der Praxis beginnen Sie in der Regel mit SIGTERM und eskalieren nur bei Bedarf. Wenn zum Beispiel kill -15 <PID> einen hängenden Java-Prozess nicht stoppt, erzwingt kill -9 <PID> (SIGKILL) die sofortige Beendigung. Der Linux-Befehl kill ist ein mächtiges Werkzeug, daher sollten stärkere Signale mit Vorsicht eingesetzt werden, insbesondere wenn Sie Prozessgruppen oder mehrere laufende Prozesse betreffen:
[root@host ~]# ps -eo user,pid,command | grep java
tomcat 66469 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start
root 66516 grep --color=auto java
[root@host ~]# kill -9 66469
[root@host ~]#
[root@host ~]# ps -eo user,pid,command | grep java
root 66530 grep --color=auto java
[root@host ~]#
Verwenden Sie für den Linux-Befehl kill folgende Syntax:
kill [OPTIONS] [PID]
Wenn zum Beispiel ein httpd-Prozess die PID 21567 hat, können Sie eine geordnete Beendigung anfordern, indem Sie das Standardsignal TERM senden:
kill 21567
Wenn der Prozess immer noch nicht stoppt, können Sie die Beendigung mit SIGKILL erzwingen (ohne Aufräumen oder Warten):
kill -9 21567
kill -SIGKILL 21567
kill -KILL 21567
So beenden Sie einen Prozess anhand der Prozess-ID
Um eine Anwendung zu stoppen, benötigen Sie zunächst ihre Prozess-ID (PID). Einer der schnellsten Wege, sie zu finden, besteht darin, die laufenden Prozesse mit ps aufzulisten und die Ausgabe nach dem Namen zu filtern. So finden Sie zum Beispiel Firefox:
ps aux | grep firefox
Sobald Sie die richtige PID bestätigt haben, können Sie den Prozess sofort beenden, indem Sie SIGKILL senden:
kill -9 PID
So beenden Sie mehrere Prozesse gleichzeitig
Wenn sich mehrere zusammengehörige Prozesse fehlerhaft verhalten, können Sie sie mit einem einzigen Befehl stoppen, indem Sie mehrere PIDs angeben:
kill -9 PID_1 PID_2 PID_3
So senden Sie bestimmte Signale mit dem Linux-Befehl kill
Der Linux-Befehl kill sendet ein Signal an einen Prozess mit dieser allgemeinen Syntax:
kill [signal] PID
Signale können in drei gängigen Formaten angegeben werden:
- Als Nummer (Signal-ID)
- Mit dem Präfix SIG
- Ohne das Präfix SIG
Um alle verfügbaren Signale und ihre Nummern anzuzeigen, führen Sie Folgendes aus:
kill -l
1) Signal als Nummer angeben
SIGKILL ist Signal 9. So beenden Sie PID 9338 zwangsweise:
kill -9 9338
2) Signal mit dem Präfix SIG angeben
Dieselbe Aktion mit dem SIG-Namen:
kill -SIGKILL 9338
3) Signal ohne das Präfix SIG angeben
Sie können SIG auch weglassen und den Signalnamen direkt verwenden:
kill -KILL 9338
Wie beenden Sie einen Prozess geordnet mit SIGTERM?
Wenn Sie eine saubere Beendigung wünschen, verwenden Sie SIGTERM (15). SIGTERM fordert den Prozess auf, sich zu beenden, und gibt ihm Zeit, Ressourcen ordnungsgemäß freizugeben. Wenn ein Prozess SIGTERM ignoriert oder nicht stoppt, können Sie zu SIGKILL eskalieren, das die Beendigung sofort erzwingt und kein Aufräumen zulässt.
Fortgeschrittene Techniken mit dem Linux-Befehl kill
Bei hartnäckigen oder wiederkehrenden Aufgaben ist der Linux-Befehl kill nicht Ihre einzige Option. Werkzeuge wie pkill und skill können die Prozesssteuerung beschleunigen, besonders wenn Sie Prozesse anhand des Namens statt der PID ansprechen möchten.
Prozesse mit pkill anhand des Namens stoppen
pkill sendet Signale an Prozesse, die bestimmten Kriterien entsprechen, etwa einem vollständigen oder teilweisen Prozessnamen, dem Benutzer, dem der Prozess gehört, oder anderen Attributen. Wenn Sie es ohne Optionen ausführen, sendet es standardmäßig SIGTERM (15) an jeden passenden Prozess. Um zum Beispiel alle Firefox-Prozesse geordnet zu beenden, verwenden Sie:
pkill -15 firefox
Da pkill Mustervergleiche unterstützt, ist kein exakter Prozessname erforderlich. Wenn Sie zum Beispiel httpd stoppen möchten und wissen, dass der Name „http“ enthält, können Sie Folgendes ausführen:
pkill http
Dieser Ansatz findet jeden laufenden Prozess, dessen Name dem Muster entspricht, und fordert dessen Beendigung an. Verwenden Sie breite Muster mit Bedacht, um keine unbeteiligten Dienste zu stoppen.
Weitere Details zu skill
„skill“ ist ein weiteres Werkzeug zum Senden von Signalen mit einem ähnlichen Ziel. Es nutzt das bekannte Signalverhalten und verwendet in der Regel standardmäßig SIGTERM. Das macht es nützlich für normale, geordnete Beendigungen, wenn Sie mit Abgleichsregeln und gezielter Auswahl arbeiten, etwa einer Filterung nach Benutzern oder nach Prozessgruppen:
skill [signal] [options]
[root@host ~]# ps -eo user,pid,command | grep tomcat
tomcat 66546 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start.
root 66846 grep --color=auto tomcat
[root@host ~]# skill -9 66546
Anstelle von skill wird empfohlen, die Befehle kill, pkill oder killall zu verwenden.
So beenden Sie mehrere Prozesse anhand des Namens mit killall
Das Werkzeug killall ist ein Linux-Kommandozeilenprogramm, das Prozesse anhand ihres Programmnamens statt einer PID beendet. Das ist praktisch, wenn eine Anwendung mehrere identische Worker startet und Sie diese gemeinsam stoppen möchten, ohne jede Prozess-ID manuell suchen zu müssen.
Die grundlegende Syntax sieht so aus:
$ killall process_name
Um zum Beispiel eine saubere Beendigung aller Firefox-Instanzen anzufordern, verwenden Sie:
$ killall firefox
Standardmäßig wird ein Beendigungssignal (SIGTERM) gesendet, das dem Programm Gelegenheit gibt, Dateien zu schließen, Sperren freizugeben und sich normal zu beenden. Wenn ein Prozess eingefroren ist oder SIGTERM ignoriert, kann ein stärkeres Signal angegeben werden, um einen sofortigen Stopp zu erzwingen:
$ killall -s SIGKILL firefox
Signale können auch als Nummer angegeben werden. Der nächste Befehl erzwingt das Stoppen von Apache auf Systemen, auf denen der Dienst unter dem Prozessnamen httpd läuft:
$ killall -9 httpd
So funktioniert der Namensabgleich und typische Fehler
Der Namensabgleich erfolgt exakt, daher werden nur Prozesse angesprochen, deren Name genau dem Argument entspricht. Da Apache in der Regel httpd und nicht http verwendet, liefert der folgende Befehl meist die Fehlermeldung, dass kein solcher Prozess existiert:
$ killall http
Bevor Sie ein destruktives Signal senden, prüfen Sie den tatsächlichen Prozessnamen mit ps oder pgrep, um das Ziel nicht zu verfehlen oder den falschen Dienst zu stoppen.
So senden Sie mit killpg ein Signal an eine ganze Prozessgruppe
Manchmal müssen Sie eine ganze Gruppe zusammengehöriger Prozesse ansprechen, die aus derselben Sitzung gestartet wurden. Der Befehl killpg sendet ein Signal an jeden Prozess in einer angegebenen Prozessgruppe (pgrp). Ist pgrp gleich 0, wird das Signal an die aktuelle Prozessgruppe des Aufrufers zugestellt, andernfalls erhalten alle Prozesse in dieser Gruppe das Signal.
Dieser Ansatz eignet sich ideal für Aufräumarbeiten, doch überprüfen Sie Muster in Produktionsumgebungen immer doppelt.
kill mit ps und grep kombinieren
Der Befehl ps zeigt, was gerade läuft, einschließlich Prozessname, PID, Eigentümer und Status. So können Sie sicherstellen, dass Sie die richtige Anwendung ansprechen, bevor Sie mit kill ein Signal senden. Um keine lange Liste durchsuchen zu müssen, filtern Sie die Ausgabe mit grep und finden so schnell den richtigen Prozess und die PID. Das verringert das Risiko, den falschen Prozess zu beenden.
Umgang mit nicht reagierenden Prozessen
Linux-Prozesse können sich in verschiedenen Zuständen befinden, darunter Running (R), Interruptible sleep (S), Uninterruptible sleep (D), Stopped (T) und Zombie (Z). Prozesse, die im Zustand D hängen oder als Z angezeigt werden, erfordern oft Aufmerksamkeit. Sie können mit folgendem Befehl nach Zustand filtern:
ps aux | awk '{if ($8=="D") print}'
Dadurch werden nur Prozesse im nicht unterbrechbaren Schlafzustand ausgegeben, was auf ein Warten auf I/O oder auf Kernel-Ebene hindeuten kann.
Prozesse anderer Benutzer verwalten
Ein normaler Benutzer kann nur Prozesse beenden, die ihm gehören. Wenn Sie Systemadministrator sind und einen Prozess eines anderen Kontos stoppen müssen, führen Sie den Befehl mit erhöhten Rechten über sudo aus oder arbeiten Sie als root.
Wann sollten Sie die Beendigung erzwingen?
Wenn SIGTERM die Anwendung nicht stoppt, beendet SIGKILL sie sofort. Da SIGKILL weder abgefangen noch blockiert oder ignoriert werden kann, sollte es erst eingesetzt werden, wenn Versuche einer geordneten Beendigung fehlgeschlagen sind.
Fortgeschrittene Befehle und Techniken zur Prozesssteuerung in Linux
Neben den Standardwerkzeugen zum Beenden von Prozessen bietet Linux eine breite Palette fortgeschrittener Befehle für spezielle Umgebungen wie Datenbanken, Container, Netzwerke, grafische Oberflächen und verteilte Systeme. Diese Werkzeuge sind besonders nützlich, wenn herkömmliche Methoden der Prozessverwaltung nicht ausreichen.
1. Der Befehl mysql_zap
Der Befehl mysql_zap wurde entwickelt, um Linux-Prozesse zu beenden, deren Ausgabezeile des Befehls ps einem bestimmten Muster entspricht. Ein Prozess gilt als Treffer, wenn das Muster an einer beliebigen Stelle in seiner ps-Ausgabe vorkommt. Wie viele Werkzeuge zum Beenden sendet mysql_zap standardmäßig ein SIGTERM-Signal, sofern nicht ausdrücklich ein anderes Signal angegeben wird.
Syntax:
[root@host ~]# mysql_zap [signal] [pattern]
Beachten Sie, dass mysql_zap in MariaDB ab Version 10.2 als veraltet gilt. Als moderne und unterstützte Alternative wird Administratoren empfohlen, pkill zu verwenden, das eine ähnliche Funktion für den Mustervergleich bietet.
2. MySQL-Abfragen mit mk-kill verwalten
Der Befehl mk-kill konzentriert sich auf die Steuerung auf Datenbankebene statt auf Systemprozesse. Er wird verwendet, um MySQL-Abfragen zu beenden, die bestimmten Kriterien entsprechen. Wird eine Datei angegeben, liest mk-kill die Abfragedaten aus dieser Datei, die in der Regel die Ausgabe von SHOW PROCESSLIST enthält. Wird keine Datei angegeben, führt er SHOW PROCESSLIST automatisch auf dem MySQL-Server aus.
Beispiele:
[root@host ~]# mk-kill --busy-time 60 --print
[root@host ~]# mk-kill --match-command Sleep --kill --no-only-oldest --interval 10
Das erste Beispiel ermittelt Abfragen, die länger als 60 Sekunden laufen. Das zweite Beispiel prüft alle 10 Sekunden auf schlafende Abfragen und beendet alle, die es findet. Das macht mk-kill besonders nützlich, um die Reaktionsfähigkeit der Datenbank aufrechtzuerhalten.
3. Langsame Abfragen mit mkill beenden
Der Befehl mkill ist eng mit mk-kill verwandt und dient dazu, langsam laufende MySQL-Abfragen zu stoppen. Er bewertet Abfragen anhand mehrerer Kriterien, darunter:
- Ausführungszeit der Abfrage
- Host
- Benutzer
- Datenbank
- Status der Abfrage
- Inhalt der Abfrage
Dieser Befehl wird häufig im automatisierten Performance-Management von Datenbanken eingesetzt.
4. Einzelne Threads mit tkill und tgkill beenden
In Situationen, in denen es besser ist, einen einzelnen Thread zu beenden statt eines ganzen Prozesses, bietet Linux tkill und tgkill. Der Befehl tkill ist veraltet und identifiziert Threads nur anhand der Thread-ID, was zu einer falschen Beendigung führen kann, wenn Thread-IDs wiederverwendet werden.
Der Befehl tgkill erhöht die Sicherheit, indem er sowohl die Thread-ID als auch die Thread-Gruppen-ID (TGID) verlangt. So wird sichergestellt, dass der richtige Thread das Signal erhält.
5. Signale mit killpg an Prozessgruppen senden
Der Befehl killpg sendet ein Signal an eine ganze Prozessgruppe. Ist die Prozessgruppen-ID auf 0 gesetzt, wird das Signal an die Prozessgruppe des Aufrufers gesendet. Andernfalls wird das Signal an alle Prozesse der angegebenen Gruppe zugestellt. Dieser Ansatz ist nützlich, um zusammengehörige Hintergrundjobs zu stoppen, die in derselben Sitzung gestartet wurden.
6. Aktive TCP-Verbindungen mit tcpkill beenden
Mit dem Befehl tcpkill können Administratoren aktive TCP-Verbindungen unterbrechen. Er kann auf einer bestimmten Netzwerkschnittstelle lauschen und beim Beenden einer Verbindung unterschiedlich starke Stufen anwenden. Die Standardstufe ist 3.
Syntax:
[root@host ~]# tcpkill [-i interface] [-1...9] expression
[root@host ~]# tcpkill -i eth0 port 21
Dieses Werkzeug wird häufig verwendet, um problematische oder unbefugte Netzwerksitzungen sofort zu trennen.
7. Containerisierte Prozesse mit lxc-kill stoppen
Bei der Arbeit mit containerisierten Umgebungen wie LXC, Kubernetes oder Docker unter Ubuntu kann der Befehl lxc-kill verwendet werden, um ein numerisches Signal an den Hauptprozess innerhalb eines Containers zu senden.
Syntax:
lxc-kill --name=NAME SIGNUM
Dies ermöglicht eine direkte Kontrolle über den Lebenszyklus von Containern und die Beendigung von Prozessen.
8. Verteilte Jobs mit arckill verwalten
Der Befehl arckill wird in ARC-fähigen Grid-Computing-Umgebungen verwendet. ARC (Advanced Resource Connector) bietet eine einheitliche Schnittstelle zum Übermitteln und Verwalten von Rechenjobs über verteilte Systeme hinweg. Jobs können entweder anhand einer Job-ID oder eines übermittelten Jobnamens beendet werden.
Beispiel:
arckill -j filename.xml (<jobid#>)
9. PVM-Prozesse mit pvm_kill beenden
Um einen bestimmten Prozess in einer PVM-Umgebung (Parallel Virtual Machine) zu stoppen, sendet der Befehl pvm_kill ein Beendigungssignal an einen Prozess, der durch seine Task-ID (TID) identifiziert wird. Dieser Befehl wird in der Regel aus größeren Anwendungen heraus aufgerufen.
Beispiele:
In C: info = pvm_kill( tid );
In Fortran: CALL PVMFKILL( TID, INFO )
10. Eingefrorene GUI-Anwendungen mit xkill schließen
Der Befehl xkill bietet eine grafische Methode zum Beenden nicht reagierender Anwendungen. Wenn er in einer Desktop-Umgebung ausgeführt wird, ändert sich das Aussehen des Mauszeigers, sodass Sie auf ein eingefrorenes Fenster klicken können. Der X-Server beendet dann sofort das zugehörige Programm.
Syntax:
xkill [-display displayname] [-id resource] [-button number] [-frame] [-all]
Dieser Befehl ist besonders nützlich, wenn grafische Anwendungen nicht mehr reagieren und sich nicht normal schließen lassen.
Vorsichtsmaßnahmen und Best Practices beim Beenden von Prozessen
Das Stoppen eines Prozesses ist nicht immer ein sauberer Reset. Wenn eine Anwendung gerade auf die Festplatte schreibt, Sperren hält, aktive Sitzungen verwaltet oder sich mit anderen Diensten abstimmt, kann ein abrupter Stopp beschädigte temporäre Daten, hängende Sperrdateien, unvollständige Transaktionen oder verwaiste Kindprozesse hinterlassen. Betrachten Sie das Beenden als kontrollierten Eingriff und nicht als Reflex: Vergewissern Sie sich, dass Sie die richtige PID haben, verstehen Sie, was der Dienst tut, und meiden Sie systemkritische Daemons, sofern Sie nicht auf Nebenwirkungen wie fehlgeschlagene Anmeldungen, Netzwerkprobleme oder Ausfallzeiten vorbereitet sind. Beginnen Sie nach Möglichkeit mit Signalen zur geordneten Beendigung und eskalieren Sie nur, wenn der Prozess eindeutig hängt.
Fazit
Das Beenden von Prozessen gleicht eher einem Skalpell als einem Hammer. Sorgfältig ausgeführt, behebt es das Problem schnell und ohne Neustart. Unvorsichtig ausgeführt, kann es größere Probleme verursachen. Es geht darum, den richtigen Prozess auf die richtige Weise zu stoppen und das System danach stabil zu halten.
Blog