Wie kann ich einen Prozess beenden, der auf einem bestimmten Port unter Linux ausgeführt wird?

761

Ich habe versucht, den Tomcat ./shutdown.shaus dem Tomcat- /binVerzeichnis zu schließen. Es wurde jedoch festgestellt, dass der Server nicht ordnungsgemäß geschlossen wurde. Daher konnte ich
meinen Tomcat nicht neu starten 8080.

Ich möchte den laufenden Tomcat-Prozess beenden 8080. Ich möchte zuerst die Liste der Prozesse haben, die an einem bestimmten Port (8080) ausgeführt werden, um auszuwählen, welcher Prozess beendet werden soll.

veer7
quelle
2
Mögliches Duplikat des Shell-Skripts, um den Prozess abzubrechen, der Port 3000 überwacht?
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Antworten:

937

Dadurch fuser 8080/tcpwird die PID des an diesen Port gebundenen Prozesses gedruckt.

Und das fuser -k 8080/tcpwird diesen Prozess beenden.

Funktioniert nur unter Linux. Universeller ist die Verwendung von lsof -i4(oder 6 für IPv6).

Nudzo
quelle
2
Schließt dies auch eine mögliche angeschlossene Buchse an 8080?
Fer y
9
Der Port wird nicht ordnungsgemäß geschlossen. Der Port wird in den Status TIME_WAIT versetzt, nachdem der übergeordnete Prozess beendet wurde. Das Betriebssystem schließt den Port dann nach etwa 60 Sekunden vollständig. Dies bedeutet, dass Sie den Port mindestens 60 Sekunden lang nicht wiederverwenden können (es sei denn, Sie geben dem Socket die Wiederverwendungsoption).
Mark Lakata
2
Auf Darwin muss eine andere Version von verwendet werden fuser. Nimmt nur eine Datei, unterstützt nicht -k.
ap
3
'fuser -k -n tcp 8080' wird den Prozess ebenfalls
Hesham Yassin
7
@dbliss Fixiereinheit ist Teil von psmisc. Falls Sie erhalten fuser: command not found, installieren Sie psmisc. Für CentOS / RHEL 7 laufensudo yum install psmisc
Tom
699

So listen Sie alle Prozesse auf, die den Port 8080 abhören:

lsof -i:8080

So beenden Sie jeden Prozess, der den Port 8080 abhört:

kill $(lsof -t -i:8080)

oder heftiger:

kill -9 $(lsof -t -i:8080)

( Entspricht -9dem SIGKILL - terminate immediately/hard killSignal: Siehe Liste der Kill-Signale und Was ist der Zweck der Option -9 im Kill-Befehl? Wenn kein Signal angegeben ist, killwird das TERM-Signal aka -15oder soft killgesendet, was manchmal nicht ausreicht, um zu töten ein Prozess.).

Franck Dernoncourt
quelle
9
kill: Verwendung: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... oder kill -l [sigspec] Das bekomme ich, wenn ich deine Befehle ausführe
Sudhir Belagali
2
@ SudhirBelagali haben Sie es mit Super User gemachtsudo
Marcel Djaman
5
Arbeitete auch auf meinem Mac
asherbar
2
Ich möchte hinzufügen, dass Sie manchmal nicht über die Berechtigung verfügen, die Prozess-ID anzuzeigen. In diesem Fall müssen Sie dies tun sudo lsof -i:8080.
Akavall
1
Warum sind die zweiten Tipps gewalttätiger?
Webwoman
281

Verwenden Sie den Befehl

 sudo netstat -plten |grep java

verwendet grep javaals tomcatVerwendungen javaals ihre Prozesse.

Es wird die Liste der Prozesse mit Portnummer und Prozess-ID angezeigt

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

Die vorherige Nummer /javaist eine Prozess-ID. Verwenden Sie nun den killBefehl, um den Prozess abzubrechen

kill -9 16085

-9 impliziert, dass der Prozess gewaltsam beendet wird.

veer7
quelle
11
Möglicherweise möchten Sie hinzufügen, dass Root-Berechtigungen erforderlich sind, um Prozessnamen abzurufen netstat.
Jonas Schäfer
2
@ JonasWielicki Sie können diejenigen sehen, die Sie ohne Root-Rechte besitzen.
Dbliss
Ich brauchte Root-Rechte für netstat. Gibt es eine Möglichkeit, tatsächlich zu wissen, woher der Prozess kam? Soweit ich das beurteilen konnte, hatte ich alle Anwendungen geschlossen, aber möglicherweise aus einem Terminalfenster, in dem ich die Prozesse versehentlich auf eine Hintergrundaufgabe verschoben habe. Vielleicht hätte ich den Terminalbefehl 'ps'
ausführen
150

Ich würde diesen Einzeiler hinzufügen, um nur LISTEN an einem bestimmten Port zu töten:

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)

Gal Bracha
quelle
9
Ich denke, das sollte die beste Antwort sein. Danke @Gal Bracha
Sam Kah Chiin
2
Dies ist die beste Lösung, da dadurch auch mein Browser nicht zerstört wird!
Russo
Beste Antwort! Einfach, prägnant und erledigt die Arbeit richtig.
Zar Bomba
116

Sie können den Befehl lsof verwenden. Lassen Sie die Portnummer wie hier 8090 sein

lsof -i:8090

Dieser Befehl gibt eine Liste der geöffneten Prozesse an diesem Port zurück.

Etwas wie…

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)

Um den Port freizugeben, beenden Sie den Prozess damit (die Prozess-ID lautet 75782)…

kill -9 75782

Dieser hat für mich gearbeitet. Hier ist der Link vom ursprünglichen Beitrag: Link

Kop4lyf
quelle
1
Um den Prozess gewaltsam zu beenden, müssen Sie -9 wie kill -9 75782 verwenden. da manchmal nur wenige Prozesse nicht mit nur töten töten
veer7
73

Wenn Sie einen Prozess beenden möchten, der auf Port 8080 ausgeführt wird, müssen Sie zuerst die PID (8080 Port Process Identification Number) ermitteln und dann beenden. Führen Sie den folgenden Befehl aus, um die PID der 8080-Portnummer zu ermitteln:

sudo lsof -t -i:8080

Hier,

  • sudo - Befehl zum Abfragen von Administratorrechten (Benutzer-ID und Passwort).
  • lsof - Liste der Dateien (Wird auch zum Auflisten verwandter Prozesse verwendet)
  • -t - Nur Prozess-ID anzeigen
  • -i - zeigt nur den Prozess der Internetverbindung an
  • : 8080 - Nur Prozesse in dieser Portnummer anzeigen

So können Sie Ihre PID jetzt ganz einfach mit dem folgenden Befehl beenden:

sudo kill -9 <PID>

Hier,

  • kill - Befehl zum Beenden des Prozesses
  • -9 - kraftvoll

Mit einem Befehl können Sie einen Prozess an einem bestimmten Port mit dem folgenden Befehl beenden:

sudo kill -9 $(sudo lsof -t -i:8080)

Weitere Informationen finden Sie unter folgendem Link: Beenden eines Prozesses an einem bestimmten Port unter Linux

Mahfuz
quelle
danke Kumpel. sudo kill -9 $(sudo lsof -t -i:8080)arbeitete für mich
Junaid
69

Der beste Weg, um alle Prozesse an einem bestimmten Port abzubrechen.

kill -9 $(sudo lsof -t -i:8080)
Berkay Kırmızıoğlu
quelle
1
Hat funktioniert! Vielen Dank.
Fred
Es hat funktioniert! Danke.
Jaylers
Wunderbar einfache Lösung mit einer Subshell. Vielen Dank!
Jason R Stevens CFA
sudo fordert nicht zur Eingabe eines Passworts auf
Kuldeep Yadav
41

Dies wird gedruckt, um die Prozess-IDs von allem, auf dem ausgeführt wird, zu standardisieren <port_number>:

fuser -n tcp <port_number> 

Es druckt auch einige Sachen an stderr, also:

fuser -n tcp <port_number> 2> /dev/null

Wir können dann diese Prozess-IDs an den killBefehl senden :

sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

Sie können dies auch in eine Funktion einfügen, wenn Sie es häufig tun:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}
Brian Peterson
quelle
35

Holen Sie sich die PID der Aufgabe und beenden Sie sie.

lsof -ti:8080 | xargs kill
Rahul Garg
quelle
Danke für die Antwort. Funktioniert sehr reibungslos unter Mac OS. Du bist der beste. Just Up Vote.
AMIC MING
1
Funktioniert auch gut mit Portbereichen wie lsof -ti:8080-8089 | xargs kill.
dvlsg
34

So kennen Sie die PID des Dienstes, der auf einem bestimmten Port ausgeführt wird:

netstat -tulnap | grep :*port_num*

Sie erhalten die Beschreibung dieses Prozesses. Verwenden Sie jetzt kill oder kill -9 pid. Leicht zu töten.

z.B

netstat -ap | grep :8080

tcp6       0      0 :::8080       :::*    LISTEN      1880/java 

Jetzt:

kill -9 1880

Denken Sie daran, alle Befehle als auszuführen root

Sanjay s.
quelle
30

Einzeiler

kill -9 $(lsof -t -i tcp:8080)

Erklärung hier: Verwenden Sie eine Kombination von lsof and kill

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

Wählen Sie pid und verwenden Sie kill

kill 23672
dlmeetei
quelle
22

versuche es so,

 sudo fuser -n tcp -k 8080
Adil Abbasi
quelle
16

Wählen Sie die Portnummer und wenden Sie den Befehl grep in netstat wie unten gezeigt an

netstat -ap | grep :7070

Konsolenausgabe

tcp 0 0 ::: 7070 ::: * LISTEN 3332 / java

Beenden Sie den Dienst basierend auf der PID (Process Identification Number).

kill -9 3332
Lova Chittumuri
quelle
13
  1. lsof -i tcp:8000 Dieser Befehl listet die Informationen zum Prozess auf, der in Port 8000 ausgeführt wird

  2. kill -9 [PID] Dieser Befehl beendet den Prozess

Nandhitha Ramaraj
quelle
Ich habe gerade bemerkt, dass ich dies vor ein paar Wochen versehentlich abgelehnt habe. Wenn Sie Ihre Antwort leicht bearbeiten, sollte ich sie entfernen können
Robin-Hoodie
12

Linux : Zuerst können Sie die PID dieses Befehls finden, wenn Sie den Port kennen:

netstat -tulpn 

Beispiel:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

Sie nehmen dann den Tötungsprozess. Führen Sie den folgenden Befehl aus:

töte -9 PID

Beispiel: -

töte -9 15986

Kundan Kumar
quelle
10

Linux : Sie können diesen Befehl verwenden, wenn Sie den Port kennen:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

Anschließend nehmen Sie die erste Spalte (Beispiel: f100050000b05bb8) und führen den folgenden Befehl aus:

rmsock f100050000b05bb8 tcpcb

Tötungsprozess.

ben rhouma moez
quelle
10

Sie können die Liste aller im System ausgeführten Ports zusammen mit ihren Details (PID, Adresse usw.) kennen:

netstat -tulpn

Sie können Details zu einer bestimmten Portnummer ermitteln, indem Sie die Portnummer im folgenden Befehl angeben:

sudo netstat -lutnp | grep -w '{port_number}'

Beispiel: sudo netstat -lutnp | grep -w '8080' Details werden wie folgt bereitgestellt:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

Wenn Sie einen Prozess mit pid beenden möchten, dann :kill -9 {PID}

Wenn Sie einen Prozess mit der Portnummer beenden möchten :fuser -n tcp {port_number}

Verwenden sudoSie diese Option, wenn Sie auf keine zugreifen können.

YAP
quelle
6

kill -9 `fuser 8080/tcp|xargs -n 1`Dieser Befehl beendet auch den Prozess, der Port 8080 mit TCP-Verbindung überwacht

Harshit Garg
quelle
4
sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

Ergebnis: 80 / tcp: 1858 1867 1868 1869 1871

Töte den Prozess eins nach dem anderen

töte -9 1858

Fadid
quelle
3

Ich arbeite an einem Yocto Linux-System mit einer begrenzten Anzahl verfügbarer Linux-Tools. Ich wollte den Prozess beenden, der einen bestimmten Port verwendete (1883).

Um zu sehen, welche Ports wir abhören, habe ich zunächst den folgenden Befehl verwendet:

root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      

Als nächstes fand ich den Namen des Prozesses unter Verwendung von Port 1883 folgendermaßen:

root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290

Wie wir oben sehen können, verwendet das Programm /usr/sbin/mosquittoPort 1883.

Zuletzt habe ich den Prozess beendet:

root@root:~# systemctl stop mosquitto

Ich habe es verwendet, systemctlweil es in diesem Fall ein Systemdienst war.

Daniel Jonsson
quelle
2

In meinem Fall hat cent os ein Problem mit der vorgeschlagenen Antwort. Also habe ich folgende Lösung verwendet:

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill
Kamesh Jungi
quelle
1

um auf dem aufzubauen, was @ veer7 gesagt hat:

Wenn Sie wissen möchten, was sich auf dem Port befand, tun Sie dies, bevor Sie ihn töten.

$ sudo netstat -plten |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
$ ps 25296
  PID TTY      STAT   TIME COMMAND
25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom

Verwenden Sie 'ps' und die Nummer des Prozesses, den netstat zurückgemeldet hat

JesseBoyd
quelle
1

Anders mit Git Bash:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}
Lucas Moyano Angelini
quelle
1
  1. Überprüfen Sie zuerst den Prozess netstat -lt
  2. Prozess-ID überprüfen fuser <port number>/tcp
  3. Beenden Sie den auf dem Port ausgeführten Prozess kill <process id>
Gunjan Paul
quelle
-3

In Windows wird es sein netstat -ano | grep "8080"und wir erhalten die folgende MeldungTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

WIR können die PID mit töten taskkill /F /PID 10076

Chaklader
quelle
Die Frage lautet eindeutig nach Linux-Hilfe. nicht Windows.
Babycakes