So beenden Sie einen Linux-Prozess nach Portnummer

Veröffentlicht: 2022-10-08
Linux-Laptop mit einer Bash-Eingabeaufforderung
fatmawati achmad zaenuri/Shutterstock.com

Um einen Linux-Prozess zu beenden, benötigen Sie seine ID oder seinen Namen. Wenn Sie nur den verwendeten Port kennen, können Sie ihn trotzdem beenden? Ja, auf verschiedene Weise.

Tötungsprozesse

Gelegentlich kann ein Linux-Prozess nicht mehr reagieren. Es funktioniert möglicherweise nicht mehr richtig oder es funktioniert weiterhin, ignoriert jedoch Anforderungen zum Herunterfahren oder beginnt, Speicher, CPU oder Netzwerkbandbreite zu verschlingen.

So beenden Sie Prozesse vom Linux-Terminal aus
RELATED So beenden Sie Prozesse vom Linux-Terminal

Was auch immer Ihre Motive sind, es gibt Möglichkeiten, einen Prozess von der Linux-Befehlszeile aus zu beenden. Die klassische Methode besteht darin, den Kill-Befehl mit der Prozess-ID des Prozesses zu verwenden, den Sie beenden möchten. Der kill Befehl hat einige nahe Verwandte. Der Befehl pkill einen Prozess nach Namen, und killall beendet alle Prozesse, die er finden kann und die einen Teil eines Namens teilen.

Wenn Sie über einen Prozess nur wissen, dass er einen Port auf Ihrem Computer verwendet, gibt es immer noch Möglichkeiten, ihn zu identifizieren und zu beenden. In Netzwerkbegriffen kann „Port“ eine physische Verbindung bedeuten, in die Sie ein Kabel mit einem Stecker am Ende stecken, z. B. ein CAT5- oder 6-Netzwerkkabel, oder es kann einen Softwareport bedeuten.

Ein Softwareport ist der letzte Teil einer Netzwerkverbindung. Die IP-Adresse eines Geräts identifiziert den Computer oder ein anderes Netzwerkgerät. Die Anwendungen im Computer verwenden unterschiedliche Ports. Diese bieten eine weitere Ebene der Granularität. Der Netzwerkverkehr ist mit der IP-Adresse am richtigen Computer angekommen und kann durch die Verwendung der Port-Adressierung an die richtige Anwendung geliefert werden.

Es ist wie Post, die in einem Hotel ankommt, dann sortiert und in die entsprechenden Zimmer geliefert wird. Die IP-Adresse ist wie die Straßenadresse des Hotels, und die Zimmernummern sind wie die Portnummern.

Wenn Sie Netzwerkaktivität auf einem Port sehen und Sie den Prozess, der sie generiert, nicht erkennen oder sein Verhalten problematisch oder verdächtig ist, möchten Sie vielleicht den Prozess beenden. Selbst wenn Sie nur die Portnummer kennen, können Sie den Prozess aufspüren und beenden.

Verbindungen herstellen mit socat

Damit wir einige Verbindungen beenden müssen, verwenden wir socat , um Netzwerkverbindungen mit verschiedenen Protokollen zu erstellen. Sie müssen socat installieren. Verwenden Sie diesen Befehl, um es unter Ubuntu zu installieren:

 sudo apt install socat 

Socat auf Ubuntu installieren

Verwenden Sie auf Fedora dnf :

 sudo dnf install socat 

Socat auf Fedora installieren

Auf Manjaro müssen Sie Folgendes eingeben:

 sudo pacman -S sokat 

Socat auf Manjaro installieren

Die Syntax für socat ist einfach, wenn auch etwas langatmig. Wir müssen die Quell- und Zieladressen angeben. Für jede davon müssen wir das Protokoll, die IP-Adresse und die Portnummer angeben. Wir können STDIN oder STDOUT als Quelle oder Ziel ersetzen.

Dieser Befehl erstellt eine Verbindung zwischen einem TCP-Überwachungs-Socket an Port 7889 an der Loopback-IP-Adresse 127.0.0.1 und STDOUT. Das kaufmännische Und „ & “ führt den Befehl im Hintergrund aus, sodass wir den Zugriff auf die Befehlszeile behalten.

 socat tcp-listen:7889,bind=127.0.0.1 stdout & 

Erstellen einer lauschenden TCP-Socket-Verbindung mit socat

Wir werden zwei weitere Verbindungen erstellen, damit wir eine kleine Auswahl an Sockets haben, die unterschiedliche Protokolle verwenden. Wir erstellen eine UDP-Verbindung und eine SCTP-Verbindung. Der einzige Teil des Befehls, der sich ändert, ist das Protokoll.

 socat udp-listen:7889,bind=127.0.0.1 stdout &
 socat sctp-listen:9999,bind=127.0.0.1 stdout & 

Erstellen von lauschenden UDP- und SCTP-Socket-Verbindungen mit socat

VERWANDT: Was ist der Unterschied zwischen TCP und UDP?

Töten verwenden

Natürlich können wir den Prozess mit kill beenden, solange wir die ID des Prozesses kennen. Um die PID zu finden, können wir den Befehl lsof verwenden.

Um die Details des Prozesses auf Port 7889 aufzulisten, der das TCP-Protokoll verwendet, verwenden wir die Option -i (Internetadresse) wie folgt.

 lsof -i tcp:7889 

Verwenden von lsof, um die Details eines Prozesses anzuzeigen, der einen bestimmten Port und ein bestimmtes Protokoll verwendet

Die PID dieses Prozesses ist 3141, und wir können fortfahren und das mit kill verwenden:

 sudo kill 3141

Etwas Aufwand können wir uns sparen, wenn wir Pipes verwenden. Wenn wir die Ausgabe von lsof an awk und awk , nach Zeilen zu suchen, die den Port enthalten, an dem wir interessiert sind – 7889 – und das zweite Feld dieser Zeile ausgeben, isolieren wir die PID.

 lsof -i tcp:7889 | awk '/7889/{print $2}' 

Die Ausgabe von lsof an awk übergeben

Wir können dann die Ausgabe von awk mit xargs in den Befehl kill leiten. Der xargs -Befehl übernimmt seine über Pipe geleitete Eingabe und übergibt sie als Befehlszeilenparameter an einen anderen Befehl. Wir verwenden xargs mit dem kill -Befehl.

 lsof -i tcp:7889 | awk '/7889/{print $2}' | Xargs töten 

Verwenden von Pipes, um die Ausgabe von lsof in awk und von awk in xargs zu übertragen und zu töten

Wir bekommen kein visuelles Feedback. In der typischen Linux-Manier sind keine Neuigkeiten gute Neuigkeiten. Wenn Sie überprüfen möchten, ob der Prozess beendet wurde, können Sie erneut lsof verwenden.

 lsof -i tcp:7889 

Verwenden von lsof, um nach Details eines Prozesses zu suchen, der einen bestimmten Port und ein bestimmtes Protokoll verwendet, ohne Erfolg

Da lsof nichts meldet, wissen wir, dass es keine solche Verbindung gibt.

Wir können einen Prozess mit dem UDP-Protokoll einfach entfernen, indem wir in unserem früheren Befehl „tcp“ durch „udp“ ersetzen.

 lsof -i udp:7889 | awk '/7889/{print $2}' | Xargs töten 

Verwenden von Pipes, um die Ausgabe von lsof in awk und von awk in xargs und kill für einen UDP-Socket zu übertragen

lsof erkennt jedoch das SCTP-Protokoll nicht.

 lsof -i sctp:7889 

lsof funktioniert nicht mit dem SCTP-Protokoll

Dazu können wir den Befehl ss verwenden. Wir verwenden die Option -S (SCTP), um nach SCTP-Sockets zu suchen, die Option -a (all), um nach allen Arten von Sockets zu suchen (lauschend, akzeptierend, verbunden usw.), und die Option -p (Prozesse). um die Details des Prozesses aufzulisten, der den Socket verwendet.

 ss-Sap 

Drucken der Details eines Prozesses über einen SCTP-Socket mit ss

Wir können diese Ausgabe mit grep und awk parsen. Wir könnten es auch mit grep und einigen PERL-Regexes parsen, aber auf diese Weise ist es viel einfacher zu verstehen. Wenn Sie dies mehr als ein- oder zweimal verwenden würden, würden Sie wahrscheinlich einen Alias ​​oder eine Shell-Funktion daraus machen.

Wir leiten die Ausgabe von ss an grep weiter und suchen nach unserer Portnummer 7889. Wir leiten die Ausgabe von grep an awk weiter. In awk verwenden wir die Option -F (Trennzeichenfolge), um ein Komma „ , “ als Feldtrennzeichen festzulegen. Wir suchen nach einer Zeichenfolge , die „pid=“ enthält, und drucken das zweite kommagetrennte Feld aus dieser Zeichenfolge.

 ss-Sap | grep "7889" | awk -F',' '/pid=/{print $2}' 

Verwenden von Pipes zum Verbinden von ss, grep und awk zum Extrahieren der PID-Zeichenfolge

Das hat uns den String „pid=2859“ gegeben.

Wir können das wieder in awk , das Feldtrennzeichen auf das Gleichheitszeichen „ = “ setzen und das zweite Feld aus dieser Zeichenfolge drucken, das der Text hinter dem Gleichheitszeichen sein wird.

 ss-Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' 

Verwenden von Pipes zum zweimaligen Verbinden von ss, grep und awk, um die PID zu extrahieren

Wir haben jetzt die Prozess-ID isoliert. Wir können xargs verwenden, um die PID zum kill als Befehlszeilenparameter zu übergeben.

 ss-Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | Xargs töten 

Verwenden von Pipes mit ss, grep, awk und xargs zum Beenden eines SCTP-Socket-Prozesses

Dadurch wird der Prozess beendet, der den SCTP-Protokoll-Socket auf Port 7889 verwendet hat.

Der Fixierer-Befehl

Der Befehl fuser vereinfacht die Dinge erheblich. Der Nachteil ist, dass es nur mit TCP- und UDP-Sockets funktioniert. Auf der positiven Seite sind dies die beiden häufigsten Arten von Steckdosen, mit denen Sie sich befassen müssen. Auf den von uns überprüften Ubuntu-, Fedora- und Manjaro-Rechnern war der fuser Befehl bereits installiert.

Sie müssen lediglich die Option -k (kill) verwenden und den Port und das Protokoll angeben. Sie können entweder die Option -n (Namespace) verwenden und das Protokoll und den Port angeben oder das „forward slash short format“ verwenden und die Portnummer an erster Stelle setzen.

 Fixierer -n TCP 7889
 Fixiereinheit 7889/udp 

Mit dem Befehl fuser die Prozesse löschen, die TCP- und UDP-Sockets verwenden

Die Portnummer, das Protokoll und die PID des beendeten Prozesses werden im Terminalfenster ausgegeben.

Versuchen Sie zuerst die Fixierstation

Es wird wahrscheinlich auf dem Computer installiert, an dem Sie arbeiten, und das Protokoll ist wahrscheinlich TCP oder UDP, also besteht eine große Chance, dass der einfachste Weg für Sie funktioniert.