Wie man einen Prozess tötet, der auf einem bestimmten Port unter Linux läuft
In einigen Situationen müssen Sie möglicherweise einen Prozess stoppen, der einen bestimmten Netzwerkport verwendet. Dies kann vorkommen, wenn der Prozess sich fehlverhält oder wenn Sie den Port für eine andere Anwendung freigeben müssen. In diesem ausführlichen Tutorial werden wir lernen, wie man einen Prozess, der auf einem bestimmten Port läuft, beendet in Linux- und Unix-ähnlichen Betriebssystemen.
Einführung
In Linux können mehrere Prozesse gleichzeitig laufen, die jeweils möglicherweise verschiedene Netzwerkports für die Kommunikation verwenden. Manchmal kann ein Prozess nicht mehr reagieren oder hängen bleiben, was Probleme mit der Anwendung oder dem Dienst verursacht, den er ausführt. In solchen Fällen müssen Sie möglicherweise den Prozess beenden oder "killen", um den von ihm verwendeten Port freizugeben.
Angenommen, Sie haben einen Apache-Webserver, der auf Ihrem Linux-Rechner läuft, und aus irgendeinem Grund reagiert er nicht mehr. Apache läuft normalerweise auf Port 80 (HTTP) oder 443 (HTTPS). Wenn Sie versuchen, auf Ihre Webseite zuzugreifen und sie nicht lädt, müssen Sie möglicherweise den Apache-Prozess beenden und neu starten.
Wenn Sie also nicht reagierende Prozesse, die auf einem bestimmten Port lauschen, finden und beenden möchten, können Sie die Befehle fuser, lsof, netstat und ss wie in den folgenden Abschnitten beschrieben verwenden.
Einen Prozess, der auf einem bestimmten Port läuft, mit dem Befehl fuser beenden
Das Beenden eines Prozesses, der auf einem bestimmten Port unter Linux ausgeführt wird, kann mit einigen Methoden erreicht werden. Ein gängiger Ansatz ist die Verwendung des Fuser-Befehlszeilenprogramms.
Der fuser (Dateibenutzer)-Befehl in Linux ist ein leistungsfähiges Werkzeug, das dabei hilft, Prozesse zu identifizieren, die bestimmte Dateien, Sockets oder Dateisysteme verwenden. Er ist besonders nützlich zur Fehlerbehebung bei Problemen im Zusammenhang mit Dateisperren, Prozessverwaltung und Systemressourcen.
Der fuser-Befehl ist Teil des psmisc-Pakets, daher müssen Sie, falls er auf Ihrem Linux-System nicht verfügbar ist, möglicherweise das psmisc-Paket mit dem Paketmanager Ihres Systems installieren.
Führen Sie zum Beispiel den folgenden Befehl aus, um psmisc auf Arch Linux und dessen Varianten wie EndeavourOS, Garuda Linux und Manjaro Linux zu installieren:
$ sudo pacman -S psmiscAuf Debian- und Ubuntu- sowie deren Derivat-Systemen:
$ sudo apt install psmiscAuf Fedora, RHEL, Almalinux und Rocky Linux:
$ sudo dnf install psmiscAuf SUSE/openSUSE:
$ sudo zypper install psmiscLassen Sie uns nun sehen, wie man einen Dienst oder Prozess, der auf einem bestimmten Port lauscht, mit dem Befehl fuser beendet.
1. Identifizieren Sie den Prozess, der den Port verwendet:
Um herauszufinden, welcher Prozess einen bestimmten Port verwendet, können Sie den Befehl fuser verwenden:
fuser <port_number>/tcpErsetzen Sie <port_number> durch die tatsächliche Portnummer. Zum Beispiel, um den Port 8080 zu überprüfen:
$ fuser 8080/tcp
Dieser Befehl gibt die PIDs aller Prozesse aus, die den TCP-Port 8080 geöffnet haben.
2. Beenden Sie den Prozess, der den Port verwendet:
Sobald Sie die PID haben, können Sie den Prozess mit folgendem Befehl beenden:
$ fuser -k 8080/tcpDie -k-Option beendet (tötet) alle Prozesse, die den TCP-Port 8080 geöffnet haben.
3. Prozesse auflisten, die an einen UDP-Port gebunden sind:
$ fuser 8080/udpDies wird die PIDs der Prozesse auflisten, die den UDP-Port 8080 geöffnet haben.
Bitte beachten Sie, dass der Port, den ein Prozess verwendet hat, möglicherweise nicht sofort nach dessen Beendigung wieder zur Verfügung steht. Stattdessen tritt der Port in einen TIME_WAIT-Zustand für ungefähr 60 Sekunden ein, bevor er vom Betriebssystem vollständig geschlossen wird. Diese Verzögerung ist eine Sicherheitsmaßnahme, um potenzielle Datenbeschädigungen oder Konflikte zu verhindern.
Wenn Sie den Port früher wiederverwenden müssen, können Sie den neuen Prozess oder die neue Anwendung so konfigurieren, dass die Port-Wiederverwendung durch das Setzen der entsprechenden Socket-Optionen (z. B. SO_REUSEADDR unter Linux) ermöglicht wird.
Einen Prozess, der auf einem bestimmten Port läuft, mit dem Befehl lsof beenden
Der lsof-Befehl ist ein leistungsfähiges Werkzeug in Linux- und Unix-ähnlichen Betriebssystemen, das Informationen über geöffnete Dateien und die Prozesse, die sie geöffnet haben, auflistet.
Es steht für „Liste offener Dateien“ und bietet eine umfassende Übersicht darüber, welche Dateien, Verzeichnisse, Netzwerksockets und andere Systemressourcen von verschiedenen Prozessen, die auf dem System laufen, verwendet werden.
1. Identifizieren Sie die Prozess-ID (PID) mit dem Port
Zuerst müssen Sie herausfinden, welcher Prozess den Port verwendet. Sie können den Befehl lsof (List Open Files) verwenden, um dies zu tun.
sudo lsof -i :<port_number>Ersetzen Sie <port_number> durch die tatsächliche Portnummer. Zum Beispiel, wenn Sie Port 8080 überprüfen möchten, würden Sie Folgendes ausführen:
$ sudo lsof -i :8080Dieser Befehl listet die Details des Prozesses auf, der Port 8080 verwendet. Suchen Sie in der Ausgabe nach der Spalte PID, um die Prozess-ID zu erhalten.
2. Beende den Prozess mit der PID
Sobald Sie die PID haben, können Sie den Prozess mit dem kill-Befehl beenden.
sudo kill -9 <PID>Ersetzen Sie <PID> durch die tatsächliche Prozess-ID. Zum Beispiel, wenn die PID 1234 ist, würden Sie Folgendes ausführen:
$ sudo kill -9 1234Die -9-Option sendet ein SIGKILL-Signal, das den Prozess gewaltsam beendet.
Beispielszenario
Stellen Sie sich vor, Sie betreiben einen Webserver auf Port 8080, müssen ihn jedoch neu starten, weil er nicht richtig reagiert. So können Sie es tun:
Finde den Prozess, der Port 8080 verwendet:
$ sudo lsof -i :8080Die Ausgabe könnte so aussehen:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1234 user 45u IPv6 65432 0t0 TCP *:http-alt (LISTEN)Hier ist der Prozess, der Port 8080 verwendet, eine Java-Anwendung mit der PID 1234.
Prozess beenden:
$ sudo kill -9 1234Dieser Befehl stoppt die Java-Anwendung, die auf Port 8080 läuft.
Einzeiler lsof-Befehl zum Beenden von Prozessen, die an einen bestimmten Port gebunden sind
Sie können auch einen Einzeiler verwenden, um einen auf einem bestimmten Port laufenden Prozess mit dem Befehl lsof in Kombination mit dem Befehl kill zu beenden.
Hier ist der One-Liner-lsof-Befehl:
$ kill -9 $(lsof -t -i:8080 -sTCP:LISTEN)Lassen Sie uns diesen Einzeiler aufschlüsseln und verstehen, wie er funktioniert:
lsof -t -i:8080 -sTCP:LISTEN: Dieser Teil des Befehls verwendetlsof, um die Prozesse aufzulisten, die den TCP-Port 8080 geöffnet haben und sich imLISTEN-Zustand befinden.
-t: Diese Option weistlsofan, nur die Prozess-IDs (PIDs) der übereinstimmenden Prozesse anzuzeigen.-i:8080: Diese Option gibt an, nach Prozessen zu suchen, die die angegebene Internetadresse und den Port verwenden (in diesem Fall Port 8080).-sTCP:LISTEN: Diese Option filtert die Ergebnisse, um nur Prozesse anzuzeigen, die TCP-Sockets imLISTEN-Zustand haben (d.h., aktiv auf dem Port lauschen).
$ (...): Dieser Teil des Befehls ist eine Subshell, was bedeutet, dass die Ausgabe deslsof-Befehls innerhalb der Klammern erfasst und im äußeren Befehl ersetzt wird.kill -9: Dieser Teil des Befehls verwendet daskill-Dienstprogramm, um Prozesse zu beenden. Die-9-Option sendet dasSIGKILL-Signal, das ein zwangsweises Beendigungssignal ist, das vom Prozess weder abgefangen noch ignoriert werden kann.
Also passiert Folgendes: lsof findet zunächst die Prozess-IDs (PIDs) aller Prozesse, die am TCP-Port 8080 lauschen. Die Ausgabe (nur die PIDs) wird dann in den Befehl kill -9 eingesetzt, der diese Prozesse gewaltsam beendet.
Dieser Einzeiler-Befehl ist prägnant und effizient, da er die Schritte zur Prozessidentifikation und -beendigung in einem einzigen Befehl kombiniert.
Es ist wichtig, es vorsichtig zu verwenden, da das SIGKILL-Signal potenziell zu Datenverlust oder anderen unbeabsichtigten Folgen führen kann, wenn es nicht richtig verwendet wird.
Zusätzlich kann, wie bereits erwähnt, das Beenden eines Prozesses den Port aufgrund des TIME_WAIT-Zustands nicht sofort freigeben.
Wenn Sie den Port sofort nach dem Beenden des Prozesses wiederverwenden müssen, müssen Sie möglicherweise den neuen Prozess so konfigurieren, dass die Port-Wiederverwendung erlaubt ist, oder warten, bis der TIME_WAIT-Zustand abgelaufen ist (typischerweise 60 Sekunden unter Linux).
Einen auf einem bestimmten Port lauschenden Dienst mit den Befehlen ss und netstat beenden
Die Befehle ss (Socket-Statistiken) und netstat (Netzwerkstatistiken) können ebenfalls verwendet werden, um Dienste (oder Prozesse), die auf bestimmten Ports lauschen, zu identifizieren, bevor sie mit dem Befehl kill beendet werden.
Die Verwendung von ss, netstat und grep zusammen ermöglicht es Ihnen, Prozesse, die auf bestimmten Ports lauschen, schnell zu identifizieren und sie dann gezielt mit dem kill-Befehl zu beenden.
Dieser Ansatz ist besonders nützlich, wenn Sie Netzwerkdienste verwalten oder Portkonflikte beheben müssen auf Linux-Systemen.
Angenommen, Sie haben eine Instanz des Apache-Webservers auf Ihrem Linux-Rechner laufen und müssen sie beenden, weil sie nicht mehr reagiert oder Sie den von ihr verwendeten Port freigeben möchten (typischerweise Port 80 für HTTP oder 443 für HTTPS).
Zuerst möchte ich Ihnen zeigen, wie Sie das mit dem Befehl netstat machen.
Verwendung des netstat-Befehls
Der netstat-Befehl ist ein Kommandozeilenprogramm, das Netzwerkverbindungen, Routingtabellen, Schnittstellenstatistiken, Masquerade-Verbindungen und Multicast-Mitgliedschaften anzeigt.
Es ist seit langem ein Teil von Linux- und Unix-ähnlichen Systemen und wird häufig für Netzwerk-Fehlerbehebung und -Überwachung verwendet.
netstatsteht für „Netzwerkstatistiken“ und wird verwendet, um verschiedene netzwerkbezogene Informationen anzuzeigen.- Es kann aktive TCP-Verbindungen, Routing-Tabellen, Schnittstellenstatistiken und mehr anzeigen.
netstatunterstützt verschiedene Filteroptionen, wie zum Beispiel das Filtern nach Protokoll, Status, Port und mehr.- Es liefert Informationen über sowohl eingehende als auch ausgehende Netzwerkverbindungen.
- Die Ausgabe von
netstatkann schwieriger zu lesen und zu interpretieren sein als die vonss.
Zuerst können Sie netstat verwenden, um alle Prozesse aufzulisten, die auf TCP-Ports lauschen, und die Ausgabe filtern, sodass nur die an Apache gebundenen angezeigt werden:
$ sudo netstat -tnlp | grep -i apacheHier,
-tzeigt TCP-Sockets-nverhindert die Auflösung von Servicenamen-lzeigt nur lauschende Sockets-pzeigt die Prozess-ID und den Namen| grep -i apachefiltert die Ausgabe, um Zeilen anzuzeigen, die „apache“ (nicht groß/kleinschreibungsempfindlich) enthalten
Dies sollte eine Zeile ähnlich wie folgt anzeigen:
tcp6 0 0 :::80 :::* LISTEN 12345/apache2Hier ist 12345 die Prozess-ID (PID) des Apache-Prozesses, der auf Port 80 lauscht.
Um diesen Prozess zu beenden, können Sie den Befehl kill mit der PID verwenden:
$ sudo kill 12345Wenn der Prozess nicht ordnungsgemäß beendet wird, können Sie die Option -9 verwenden, um ihn zwangsweise zu beenden:
$ sudo kill -9 12345Verwendung des ss-Befehls
Der ss-Befehl ist ein Dienstprogramm, das verwendet wird, um Sockets auf einem Linux-System zu untersuchen. Er ist eine Alternative zum älteren netstat-Befehl und liefert detailliertere Informationen über Netzwerkverbindungen, abhörende Sockets und Socket-Statistiken.
sssteht für "Socket-Statistiken" und wird verwendet, um Socket-Statistiken und Informationen auszugeben.- Es bietet detaillierte Informationen über TCP, UDP, UNIX-Domain-Sockets und Rohsockets.
sshat ein benutzerfreundlicheres Ausgabeformat im Vergleich zunetstat.- Es unterstützt verschiedene Filteroptionen, wie z. B. das Filtern nach Protokoll, Zustand, Port und mehr.
ssist typischerweise effizienter und schneller alsnetstat, da es das/proc-Dateisystem nicht nach Informationen durchsuchen muss.
Liste alle TCP-Lauschprozesse auf und filtere nach Apache:
$ sudo ss -tnlp | grep -i apache-tzeigt TCP-Sockets-nverhindert die Auflösung von Servicenamen-lzeigt nur lauschende Sockets-pzeigt die Prozess-ID und den Namen| grep -i apachefiltert die Ausgabe, um Zeilen anzuzeigen, die „apache“ (nicht groß/klein-empfindlich) enthalten
Dies sollte eine Zeile ähnlich wie folgt anzeigen:
LISTEN 0 4096 :::80 :::* users:(("apache2",pid=12345,fd=4))Nochmals, 12345 ist die Prozess-ID des Apache-Prozesses.
Beenden Sie den Prozess mit kill:
$ sudo kill 12345Oder, um zwangsweise zu beenden:
$ sudo kill -9 12345In den obigen Beispielen verwenden wir netstat oder ss, um den Apache-Webserver-Prozess zu identifizieren, der an Port 80 (HTTP) lauscht, und beenden ihn dann mit dem Befehl kill unter Verwendung der entsprechenden Prozess-ID.
Dieser Ansatz kann auf jeden anderen Dienst oder Prozess angewendet werden, der auf einem bestimmten Port auf Ihrem Linux-System lauscht. Ersetzen Sie einfach "apache" im grep-Befehl durch den Namen oder einen Teil des Namens des Dienstes, an dem Sie interessiert sind.
Während sowohl ss als auch netstat verwendet werden können, um Informationen über Netzwerkverbindungen und Sockets zu erhalten, wird ss im Allgemeinen als moderner und benutzerfreundlicher angesehen. netstat wird jedoch immer noch weit verbreitet genutzt und ist auf den meisten Linux- und Unix-ähnlichen Systemen verfügbar.
Nochmals, ich empfehle Ihnen dringend, beim Beenden von Prozessen Vorsicht walten zu lassen, insbesondere bei der Verwendung der Option -9 (SIGKILL), da dies zu Datenverlust oder anderen unbeabsichtigten Folgen führen kann, wenn sie nicht sorgfältig verwendet wird.
Stellen Sie immer sicher, dass Sie den richtigen Prozess beenden und die möglichen Auswirkungen verstehen, bevor Sie den kill-Befehl ausführen.
Häufig gestellte Fragen (FAQ)
F: Was ist der Zweck des fuser-Befehls?
A: Der fuser-Befehl (Dateibenutzer) wird verwendet, um Prozesse zu identifizieren, die bestimmte Dateien, Verzeichnisse, Dateisysteme oder Netzwerksockets (Ports) auf einem Linux-System verwenden. Er ist besonders nützlich bei der Fehlerbehebung von Dateisperrproblemen, der Verwaltung von Netzwerkdiensten und der Identifizierung von Prozessen, die möglicherweise Datei- oder Verzeichnisoperationen verhindern.
F: Wie kann ich fuser verwenden, um Prozesse aufzulisten, die an einen bestimmten Port gebunden sind?
A: Um Prozesse aufzulisten, die an einen TCP-Port gebunden sind, verwenden Sie den Befehl fuser PORT/tcp. Zum Beispiel listet fuser 8080/tcp die Prozess-IDs (PIDs) von Prozessen auf, die den TCP-Port 8080 verwenden. Ebenso kann fuser PORT/udp für UDP-Ports verwendet werden.
F: Kann fuser Prozesse beenden, die an einen Port gebunden sind?
A: Ja, die -k-Option in fuser erlaubt es Ihnen, Prozesse zu beenden (killen), die mit der angegebenen Ressource verbunden sind, wie z. B. einer Datei oder einem Netzwerk-Socket. Zum Beispiel wird fuser -k 8080/tcp alle Prozesse beenden, die den TCP-Port 8080 verwenden.
F: Wofür wird der lsof-Befehl verwendet?
A: Der lsof (list open files) Befehl wird verwendet, um geöffnete Dateien und Netzwerksockets auf einem Linux-System aufzulisten, zusammen mit den Prozessen, die sie geöffnet haben. Er ist nützlich, um Prozesse zu identifizieren, die eine bestimmte Datei oder einen bestimmten Port geöffnet haben, was bei der Fehlerbehebung und Verwaltung von Netzwerkdiensten hilfreich sein kann.
F: Wie kann ich lsof verwenden, um Prozesse zu finden, die einen bestimmten Port benutzen?
A: Um Prozesse aufzulisten, die einen bestimmten Port verwenden, verwenden Sie den Befehl lsof -i:PORT. Zum Beispiel listet lsof -i:8080 alle Prozesse auf, die Port 8080 geöffnet haben, unabhängig vom Protokoll (TCP oder UDP).
F: Was sind die Unterschiede zwischen ss und netstat?
A: Sowohl ss (Socket-Statistiken) als auch netstat (Netzwerkstatistiken) werden verwendet, um Netzwerkverbindungen, lauschende Sockets und Socket-Statistiken auf Linux-Systemen anzuzeigen. ss gilt jedoch im Allgemeinen als moderner und benutzerfreundlicher, mit einem besseren Ausgabeformat und effizienterer Implementierung. netstat ist ein älterer Befehl, wird aber immer noch weit verbreitet verwendet.
F: Wie kann ich ss oder netstat verwenden, um Prozesse zu finden, die an einem bestimmten Port lauschen?
A: Um Prozesse aufzulisten, die an einem bestimmten Port lauschen, verwenden Sie den Befehl ss -tnlp | grep PORT. Zum Beispiel listet ss -tnlp | grep 8080 alle TCP-lauschenden Prozesse auf Port 8080 auf. Für netstat verwenden Sie netstat -tnlp | grep PORT.
F: Kann ich einen Prozess direkt aus der Ausgabe von ss oder netstat beenden?
A: Ja, Sie können einen Einzeiler-Befehl verwenden, um einen Prozess direkt aus der Ausgabe von ss oder netstat zu beenden. Zum Beispiel wird kill -9 $ (lsof -t -i:8080 -sTCP:LISTEN) jeden Prozess beenden, der auf dem TCP-Port 8080 lauscht.
F: Was ist die Bedeutung der -9-Option im kill-Befehl?
A: Die -9-Option im kill-Befehl sendet das SIGKILL-Signal, das den Prozess zwangsweise beendet, ohne ihm die Möglichkeit zu geben, Bereinigungen vorzunehmen oder Daten zu speichern. Dies sollte mit Vorsicht verwendet werden, da es zu Datenverlust oder anderen unbeabsichtigten Folgen führen kann, wenn es nicht sorgfältig eingesetzt wird.
F: Warum könnte ein Port nach dem Beenden eines Prozesses nicht sofort zur Wiederverwendung verfügbar sein?
A: Wenn Sie einen Prozess beenden, kann es sein, dass der von ihm verwendete Port nicht sofort wieder zur Verfügung steht. Stattdessen tritt der Port für ungefähr 60 Sekunden in einen TIME_WAIT-Zustand ein, bevor er vom Betriebssystem vollständig geschlossen wird. Diese Verzögerung ist eine Sicherheitsmaßnahme, um mögliche Datenbeschädigungen oder Konflikte zu verhindern.
Fazit
Die fuser-, lsof-, netstat- und ss-Befehle sind leistungsstarke Werkzeuge zur Verwaltung von Prozessen und Ports auf Linux-Systemen. Sie bieten eine bequeme Möglichkeit, Prozesse zu identifizieren und zu beenden, die Probleme oder Konflikte verursachen könnten, insbesondere bei der Arbeit mit netzwerkbezogenen Anwendungen oder Diensten.
Sie können sie in den folgenden Fällen verwenden:
- Freigeben eines Ports: Wenn Sie eine andere Anwendung auf demselben Port ausführen müssen.
- Anhalten eines fehlverhaltenden Prozesses: Wenn eine Anwendung nicht reagiert oder sich unerwartet verhält.
- Neustarten von Diensten: Manchmal ist es schneller, einen Dienst durch Beenden seines Prozesses neu zu starten, als den Server neu zu starten.
Während es sicherlich andere Methoden gibt, um diese Ziele zu erreichen, sind diese vier Befehle für mich gerade genug, um diese Aufgabe zu erledigen.
Ich bin auch offen dafür, alle Ihre Vorschläge anzuhören. Bitte zögern Sie nicht, Ihre Vorschläge im Kommentarbereich unten zu erwähnen.
Verwandte Lektüre:
- So finden Sie heraus, welcher Dienst auf einem bestimmten Port lauscht
- So finden Sie die Portnummer eines Dienstes unter Linux