Suchen (und beenden) Sie den Prozesssperrport 3000 auf dem Mac

1809

Wie finde (und töte) ich Prozesse, die meine TCP-Ports abhören / verwenden? Ich bin auf Mac OS X.

Manchmal, nach einem Absturz oder einem Fehler, sperrt meine Rails-App Port 3000. Ich kann ihn mit ps -ef nicht finden ...

Wenn Sie das tun

rails server

Ich bekomme

Bereits verwendete Adresse - bind (2) (Errno :: EADDRINUSE)

Update 2014:

So vervollständigen Sie einige der folgenden Antworten: Nach dem Ausführen der Kill-Befehle muss möglicherweise die PID-Datei gelöscht werden rm ~/mypath/myrailsapp/tmp/pids/server.pid

oma
quelle
25
Eine sehr nette Lösung, um einen Prozess an JEDEM benutzerdefinierten Port abzubrechen, finden Sie in der Antwort von @ Kevin Suttle unten. Wiedergabe hier für die Nachwelt:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584
4
Port 3000 ist nicht sehr hochentwicklungsspezifisch - Meteor läuft nativ auch auf 3000, und ich bin sicher, dass es noch andere gibt.
Gregorvand
@ user456584 's Kommentar oben sollte die akzeptierte Antwort sein ^^^ Diese Funktion hat funktioniert, um die vielen Prozesse zu beenden, die ich auf einem Port ausgeführt habe
Aneuway

Antworten:

3025
  1. Du kannst es versuchen netstat

    netstat -vanp tcp | grep 3000
    
  2. Verwenden Sie für macOS El Capitan und höher (oder wenn Ihr netstat dies nicht unterstützt -p)lsof

    sudo lsof -i tcp:3000 
    
  3. Für Centos 7 verwenden

    netstat -vanp --tcp | grep 3000
    
Ghostdog74
quelle
22
Vielen Dank! Ihre Antwort brachte mein Skript "death_to 'port'" hervor. (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1
191
Das "knappe" Flag für lsof erzeugt eine Ausgabe, die für die Weiterleitung zu einem nachfolgenden Kill geeignet ist:lsof -t -i tcp:1234 | xargs kill
Manav
5
Ich habe dies in meine geschrieben ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillJetzt muss ich nur noch tippen killport 8080und es spart mir einige Sekunden
Alfonso Pérez
3
Ein weiterer Tipp: Versuchen sudoSie es
Abe Petrillo
4
Ein weiterer Tipp ist, -Pdem lsofBefehl hinzuzufügen , damit der Raw-Port in der Ausgabe sichtbar ist:lsof -P -i:3000
Jason Axelson
1874

Finden:

sudo lsof -i :3000

Töten:

kill -9 <PID>
Filip Spiridonov
quelle
61
Manchmal zeigt lsof -i: port nichts an. versuchen Sie sudo lsof -i: port .
Kilik52
31
Es wird empfohlen, es zu versuchen, kill -15 <PID>bevor Sie -9aus Sicherheitsgründen darauf zurückgreifen .
Jamon Holmgren
7
@ Jamon Holmgren warum? Was machen beide? und warum ist ein kill <PID>nicht ausreichend / gefährlich / unvollständig?
Michael Trouw
13
@ MichaelTrouw fast ein Jahr später, aber hier ist Ihre Antwort. :-) unix.stackexchange.com/a/8918 TL; DR kill -15gibt dem Prozess die Möglichkeit, nach sich selbst aufzuräumen.
Jamon Holmgren
9
Ich denke, diese Antwort sollte sagen, was -9tut.
Joseph Fraley
206

Nichts oben hat bei mir funktioniert. Jeder andere mit meiner Erfahrung könnte Folgendes versuchen (für mich gearbeitet):

Lauf:

lsof -i :3000 (where 3000 is your current port in use)

Überprüfen Sie dann den Status der gemeldeten PID:

ps ax | grep <PID>

schließlich "fang damit an":

kill -QUIT <PID>
Austin
quelle
18
Dies scheint tatsächlich eine bessere Antwort zu sein als die, die Filip Spiridonov viel später gegeben hat. Er hat 277 positive Stimmen gegen Ihre 9. Ihre war 6 Monate zuvor und hat die gleichen Informationen mit etwas mehr Erklärung. Es gibt keine Gerechtigkeit ...
Floris
Versuchen Sie es kill -TERM(oder nur kill) vorher kill -QUIT. Nicht jeder Prozess wird SIGQUIT ordnungsgemäß herunterfahren.
craig65535
160

Ein Einzeiler, um die PID des Prozesses über Port 3000 zu extrahieren und zu beenden.

lsof -ti:3000 | xargs kill

Das Flag -t entfernt alles außer der PID aus dem lsof-Ausgang, wodurch es einfach ist, ihn zu beenden.

Zlemini
quelle
13
Sie können "lauschende" Ports lsof -ti:3000 -sTCP:LISTEN
herausfiltern
1
Diese Methode funktioniert am besten für mich. Einfacher Einzeiler, der den belebten Hafen löscht. Vielen Dank!
Ryan Trainor
138

Einfachste Lösung :

Für einen einzelnen Port:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Beenden Sie mehrere Ports mit einem einzeiligen Befehl:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof-ti: 3000

82500 (Prozess-ID / PID)

lsof-ti: 3001

82499

lsof-ti: 3001.3000

82499 82500

töte $ (lsof -ti: 3001,3000)

Beendet sowohl 82499- als auch 82500-Prozesse in einem einzigen Befehl.

Für die Verwendung in package.jsonSkripten:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }

Abhijith Sasikumar
quelle
2
Das hat bei mir funktioniert Danke :)
DILEEP THOMAS
2
Ich bin froh, dass es geholfen hat.
Abhijith Sasikumar
113

Diese einzelne Befehlszeile ist leicht zu merken:

npx kill-port 3000

Für ein leistungsfähigeres Tool mit Suche:

npx fkill-cli


PS: Sie verwenden Javascript-Pakete von Drittanbietern. npxwird mit Node.js eingebaut.

Quellen: tweet | Github

Bruno Lemos
quelle
Können Sie Details zur Installation von npx mit Brew mitteilen? Ich habe versucht, es auf meinem Mac High Sierra 10.13.3 zu installieren, aber es funktioniert nicht.
RealPK
@realPK npxkommt mit npmdem kommt mit node.js, es ist also nicht ein separates Paket. Aktualisieren Sie einfach Ihre node.js und Ihre npm-Versionen.
Bruno Lemos
Ich mache meistens Java, habe mich noch nicht Node ausgesetzt. Ich habe einen anderen Weg gefunden, um den Dienst im Hafen zu beenden. TY für die Antwort.
RealPK
5
Die Notwendigkeit für NodeJS und JavaScript, etwas zu töten, das auf Port 3000 ausgeführt wird, scheint mir zu viel Aufwand zu sein. Das Hinzufügen einer einfachen Zeile zu Ihrem .bashrc oder .zshrc mit einem Alias ​​würde dies lösen, ohne dass das Internet erforderlich wäre. alias kill3000 = 'lsof -ti: 3000 | xargs kill 'dann kannst du machen: kill3000
Khalil Gharbaoui
Beste Lösung dieses Problems .. danke
König Rayhan
107

Sie können verwenden lsof -i:3000.

Das ist "List Open Files". Auf diese Weise erhalten Sie eine Liste der Prozesse und der von ihnen verwendeten Dateien und Ports.

DerMike
quelle
Ich bin auf 10.5 Lepard (aktualisiertes Q). Ich weiß nicht, ob das hier wichtig ist, aber lsof zeigt keine Ports an. lsof -h (lsof 4.78) ist mir auch zu kryptisch ...
oma
1
Hmm. Ich weiß es nicht genau über Leopard, aber versuche es ( als Wurzel - das ist wichtig, denke ich) lsof -i:3000.
Matt Gibson
59

.bash_profileErstellen Sie in Ihrem eine Verknüpfung für terminateden 3000-Prozess:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Rufen $terminateSie dann an, wenn es blockiert ist.

alexzg
quelle
12
Sie können dies flexibel genug für jeden Port machen: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle
Und solch ein beschreibender Name = p
Michael Peterson
Ich habe etwas Ähnliches, aber ich komme im Hafen vorbei. Ich habe meine Funktion KP für Kill Port benannt.
Joseph Chambers
58

Verwenden Sie den folgenden Befehl, um einen solchen Prozess gewaltsam zu beenden

lsof -n -i4TCP:3000 

Wobei 3000 die Portnummer ist, an der der Prozess ausgeführt wird

Dies gibt die Prozess-ID (PID) zurück und wird ausgeführt

kill -9 "PID"

Ersetzen Sie die PID durch die Nummer, die Sie nach dem Ausführen des ersten Befehls erhalten

Zum Beispiel, wenn ich den auf Port 8080 ausgeführten Prozess beenden möchte

Tadele Ayelegn
quelle
38
lsof -P | grep ':3000' | awk '{print $2}'

Dies gibt Ihnen nur die PID, die unter MacOS getestet wurde.

Kris
quelle
10
auf MAC alle Pids auf Port 3000 töten: lsof -P | grep ': 3000' | awk '{print $ 2}' | Xargs töten -9
Mike Clagg
1
Kann mehr als ein Prozess denselben Port abhören?
Kris
Unsere Rails-App bringt Arbeiter hervor, die
untergeordnete
2
Dies tötet auch Webbrowser, die eine Verbindung zum Port herstellen
fjsj
5
Hier arbeitet eine:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
Bob
29

In der Befehlszeile unter OS-X El Captain ausführen:

kill -kill `lsof -t -i tcp:3000`

Die knappe Option von lsof gibt nur die PID zurück.

JE42
quelle
28

Eine Möglichkeit, einen Prozess an einem Port abzubrechen, besteht in der Verwendung der Python-Bibliothek: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Einmal installiert, einfach:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully
YBathia
quelle
7
Das ist bei weitem NICHT der einfachste Weg. Für die aktualisierten Antworten müssen Sie nichts herunterladen und installieren.
Greg Pasquariello
4
Wenn die Voraussetzungen erfüllt sind, ist dies so einfach und leicht zu merken. Wir haben eine andere Definition von "am einfachsten" und diese Antwort ist vollkommen gültig und angemessen. Vielleicht fehlen nur die Anweisungen zum Installieren von Freeport mit Pip.
Cyril Duchon-Doris
Unter der Haube ist Freeport nur ein Wrapper, der anruft lsof -t -i:3000. Es scheint unnötig.
Corey Goldberg
Diese Lösung ist nicht die einfachste, aber sie entspricht zu 100% den
Anforderungen
26

So zeigen Sie die Prozesse an, die den Port blockieren:

netstat -vanp tcp | grep 3000

So beenden Sie die Prozesse, die den Port blockieren:

kill $(lsof -t -i :3000)

Henry
quelle
Dies funktioniert nicht auf einem Mac-Computer und gibt Folgendes zurück: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Es funktioniert jedoch in den meisten Linux-Distributionen
Milan Velebit
1
@MilanVelebit Eigentlich funktioniert es perfekt auf meinem Mac (Sierra). Es funktioniert gut, wenn Ihr Port 3000belegt ist. Wenn jedoch kein Prozess den Port blockiert, wird eine kill: not enough argumentsFehlermeldung angezeigt.
Henry
Das ist nur seltsam, ich habe zwei Macs (beide High Sierra tho), ich erinnere mich, dass ich diese Befehle auf beiden ausgeführt habe (alte Gewohnheiten) und ich weiß mit Sicherheit, dass sie nicht ausgeführt werden. Ich habe es gerade auf meinem Computer erneut versucht, da ich weiß, dass der Port belegt ist, der gleiche Fehler. : /
Milan Velebit
Haben Sie beim Ausführen eine gültige PID netstat -vanp tcp | grep 3000für Ihren belegten Port erhalten?
Henry
1
Ich habe es in beiden bashund zshShell versucht . Funktioniert gut für mich. Ich bin mir nicht sicher, warum es bei Ihnen nicht funktioniert. Kann etwas mit High Sierra zu tun haben? Ich habe keine Ahnung: /
Henry
24

Finden Sie die offene Verbindung

lsof -i -P | grep -i "hör zu"

Töte nach Prozess-ID

töte -9 'PID'

Sourabh Bhagat
quelle
20

Finden und töten:

Diese einzelne Befehlszeile ist einfach und funktioniert ordnungsgemäß.

kill -9 $(lsof -ti tcp:3000)
Dylan Breugne
quelle
14

Mögliche Wege, um dies zu erreichen:

oben

Der Befehl top ist die herkömmliche Methode, um die Ressourcennutzung Ihres Systems anzuzeigen und die Prozesse anzuzeigen, die die meisten Systemressourcen beanspruchen. Oben wird eine Liste der Prozesse angezeigt, wobei die Prozesse mit der meisten CPU oben stehen.

ps

Der Befehl ps listet laufende Prozesse auf. Der folgende Befehl listet alle Prozesse auf, die auf Ihrem System ausgeführt werden:

ps -A

Sie können die Ausgabe auch über grep leiten, um nach einem bestimmten Prozess zu suchen, ohne andere Befehle zu verwenden. Der folgende Befehl würde nach dem Firefox-Prozess suchen:

ps -A | grep firefox

Die häufigste Art, Signale an ein Programm zu übergeben, ist der Befehl kill.

kill PID_of_target_process

lsof

Liste aller geöffneten Dateien und der Prozesse, die sie geöffnet haben.

lsof -i -P | grep -i "listen"
kill -9 PID

oder

 lsof -i tcp:3000 
glatt
quelle
10

lsof -i tcp:port_number - listet den Prozess auf, der an diesem Port ausgeführt wird

kill -9 PID - wird den Prozess beenden

in deinem Fall wird es sein

lsof -i tcp:3000 Finden Sie von Ihrem Terminal aus die PID des Prozesses

kill -9 PID

Shan
quelle
10

Mit diesen beiden Befehlen können Sie den Serverprozess finden und beenden

  1. lsof -wni tcp: 3000
  2. töte -9 pid
Saif Chaudhry
quelle
Es war mir ein Vergnügen, Aashiah
Saif Chaudhry
5

Hinzufügen zu ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Dann source ~/.bash_profileund renn

killTcpListen 8080

Rofrol
quelle
4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Wenn Sie sich in einer Situation befinden, in der sowohl Clients als auch Server den Port verwenden, z.

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

dann willst du wahrscheinlich nicht beide töten.

In dieser Situation können Sie -sTCP:LISTENnur die PID von Prozessen anzeigen, die abhören. Wenn Sie dies mit dem -tknappen Format kombinieren, können Sie den Prozess automatisch beenden:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
Benjie
quelle
4

Ich habe eine kleine Funktion dafür, fügen Sie ihn in Ihre rc - Datei ( .bashrc, .zshrcoder was auch immer)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

Dann können Sie einfach tippen kill-by-port 3000, um Ihren Rails-Server zu beenden (indem Sie den Port, auf dem er ausgeführt wird, durch 3000 ersetzen).

Andernfalls können Sie immer einfach kill -9 $(cat tmp/pids/server.pid)aus dem Rails-Stammverzeichnis eingeben

Caleb Keene
quelle
Ich musste einen Backslash ausführen \$PORT, damit die Nachricht korrekt angezeigt wurde. Ansonsten funktioniert super!
Ashwood
4

Um mehrere Ports zu töten.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Ich hoffe das hilft!

Binh Ho
quelle
1

Sie sollten dies versuchen. Diese Technik ist OS-unabhängig.

Neben Ihrer Anwendung befindet sich ein Ordner namens tmp, in dem sich ein weiterer Ordner namens pids befindet. Diese Datei enthält die Server-PID-Datei. Löschen Sie einfach diese Datei. Port tötet sich automatisch.

Ich denke, das ist der einfache Weg.

Arun P.
quelle
1

Hier ist eine Helfer-Bash-Funktion zum Beenden mehrerer Prozesse nach Name oder Port

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

Verwendungszweck:

$ fkill [process name] [process port]

Beispiel:

$ fkill someapp :8080 node :3333 :9000
Miguel Mota
quelle
1

Sie können dies versuchen

netstat -vanp tcp | grep 3000
Foram Thakral
quelle
0

Wenn Sie einen Code-freien Weg wollen - öffnen Sie den Aktivitätsmanager und erzwingen Sie den Kill-Knoten :)

HannahCarney
quelle
0

Ich benutze das:

cat tmp/pids/server.pid | pbcopy

Dann kill -9 'paste'

Mihail hidr0 Kirilov
quelle
-1

Schritt 1: Suchen Sie den Server, der ausgeführt wird: ps aux | grep puma Schritt 2: Beenden Sie diesen Server. Kill -9 [Servernummer]

Thiện Nguyễn
quelle
-1

Unter Mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')

Nichts
quelle
1
Dies wurde vor 5 Jahren als Kommentar gepostet, und ähnliche Antworten wurden mehrmals gepostet.
Gilles Gouaillardet