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
function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
Antworten:
Du kannst es versuchen
netstat
Verwenden Sie für macOS El Capitan und höher (oder wenn Ihr netstat dies nicht unterstützt
-p
)lsof
Für Centos 7 verwenden
quelle
lsof -t -i tcp:#{ARGV.first} | xargs kill
)lsof -t -i tcp:1234 | xargs kill
~/.bash_profile
:findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill
Jetzt muss ich nur noch tippenkillport 8080
und es spart mir einige Sekundensudo
Sie es-P
demlsof
Befehl hinzuzufügen , damit der Raw-Port in der Ausgabe sichtbar ist:lsof -P -i:3000
Finden:
Töten:
quelle
kill -15 <PID>
bevor Sie-9
aus Sicherheitsgründen darauf zurückgreifen .kill <PID>
nicht ausreichend / gefährlich / unvollständig?kill -15
gibt dem Prozess die Möglichkeit, nach sich selbst aufzuräumen.-9
tut.Nichts oben hat bei mir funktioniert. Jeder andere mit meiner Erfahrung könnte Folgendes versuchen (für mich gearbeitet):
Lauf:
Überprüfen Sie dann den Status der gemeldeten PID:
schließlich "fang damit an":
quelle
kill -TERM
(oder nurkill
) vorherkill -QUIT
. Nicht jeder Prozess wird SIGQUIT ordnungsgemäß herunterfahren.Ein Einzeiler, um die PID des Prozesses über Port 3000 zu extrahieren und zu beenden.
Das Flag -t entfernt alles außer der PID aus dem lsof-Ausgang, wodurch es einfach ist, ihn zu beenden.
quelle
lsof -ti:3000 -sTCP:LISTEN
Einfachste Lösung :
Für einen einzelnen Port:
Beenden Sie mehrere Ports mit einem einzeiligen Befehl:
82500 (Prozess-ID / PID)
82499
82499 82500
Beendet sowohl 82499- als auch 82500-Prozesse in einem einzigen Befehl.
Für die Verwendung in
package.json
Skripten:"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }
quelle
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.
npx
wird mit Node.js eingebaut.Quellen: tweet | Github
quelle
npx
kommt mitnpm
dem kommt mitnode.js
, es ist also nicht ein separates Paket. Aktualisieren Sie einfach Ihre node.js und Ihre npm-Versionen.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.
quelle
lsof -i:3000
..bash_profile
Erstellen Sie in Ihrem eine Verknüpfung fürterminate
den 3000-Prozess:Rufen
$terminate
Sie dann an, wenn es blockiert ist.quelle
Verwenden Sie den folgenden Befehl, um einen solchen Prozess gewaltsam zu beenden
Wobei 3000 die Portnummer ist, an der der Prozess ausgeführt wird
Dies gibt die Prozess-ID (PID) zurück und wird ausgeführt
Ersetzen Sie die PID durch die Nummer, die Sie nach dem Ausführen des ersten Befehls erhalten
quelle
Dies gibt Ihnen nur die PID, die unter MacOS getestet wurde.
quelle
lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
In der Befehlszeile unter OS-X El Captain ausführen:
Die knappe Option von lsof gibt nur die PID zurück.
quelle
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:
quelle
lsof -t -i:3000
. Es scheint unnötig.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)
quelle
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Es funktioniert jedoch in den meisten Linux-Distributionen3000
belegt ist. Wenn jedoch kein Prozess den Port blockiert, wird einekill: not enough arguments
Fehlermeldung angezeigt.netstat -vanp tcp | grep 3000
für Ihren belegten Port erhalten?bash
undzsh
Shell 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: /Finden Sie die offene Verbindung
Töte nach Prozess-ID
quelle
Finden und töten:
Diese einzelne Befehlszeile ist einfach und funktioniert ordnungsgemäß.
quelle
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:
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:
Die häufigste Art, Signale an ein Programm zu übergeben, ist der Befehl kill.
lsof
Liste aller geöffneten Dateien und der Prozesse, die sie geöffnet haben.
oder
quelle
lsof -i tcp:port_number
- listet den Prozess auf, der an diesem Port ausgeführt wirdkill -9 PID
- wird den Prozess beendenin deinem Fall wird es sein
lsof -i tcp:3000
Finden Sie von Ihrem Terminal aus die PID des Prozesseskill -9 PID
quelle
Mit diesen beiden Befehlen können Sie den Serverprozess finden und beenden
quelle
Hinzufügen zu
~/.bash_profile
:Dann
source ~/.bash_profile
und rennkillTcpListen 8080
quelle
Mit dem fkill - Tool von sindresorhus können Sie Folgendes tun:
quelle
TL; DR:
Wenn Sie sich in einer Situation befinden, in der sowohl Clients als auch Server den Port verwenden, z.
dann willst du wahrscheinlich nicht beide töten.
In dieser Situation können Sie
-sTCP:LISTEN
nur die PID von Prozessen anzeigen, die abhören. Wenn Sie dies mit dem-t
knappen Format kombinieren, können Sie den Prozess automatisch beenden:quelle
Ich habe eine kleine Funktion dafür, fügen Sie ihn in Ihre rc - Datei (
.bashrc
,.zshrc
oder was auch immer)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 eingebenquelle
\$PORT
, damit die Nachricht korrekt angezeigt wurde. Ansonsten funktioniert super!Um mehrere Ports zu töten.
Ich hoffe das hilft!
quelle
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.
quelle
Hier ist eine Helfer-Bash-Funktion zum Beenden mehrerer Prozesse nach Name oder Port
Verwendungszweck:
Beispiel:
quelle
Sie können dies versuchen
quelle
Wenn Sie einen Code-freien Weg wollen - öffnen Sie den Aktivitätsmanager und erzwingen Sie den Kill-Knoten :)
quelle
Ich benutze das:
cat tmp/pids/server.pid | pbcopy
Dann
kill -9 'paste'
quelle
Schritt 1: Suchen Sie den Server, der ausgeführt wird:
ps aux | grep puma
Schritt 2: Beenden Sie diesen Server. Kill -9 [Servernummer]quelle
Unter Mac OS
kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')
quelle