Wie finde 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 den Port 3000. Ich kann ihn nicht mit ps -ef finden ... Wie finde ich das dumme Ding und töte es brutal?
Wenn es geht
Rails server
Ich bekomme
Adresse bereits verwendet - bind (2) (Errno :: EADDRINUSE)
Update 2014:
Um einige der folgenden Antworten zu vervollständigen: Nach dem Ausführen der Kill-Befehle kann es erforderlich sein, die PID-Datei zu löschen. rm ~/mypath/myrailsapp/tmp/pids/server.pid
Sie können netstat
ausprobieren.
netstat -vanp tcp | grep 3000
Für macOS El Capitan und neuer (oder falls Ihr netstat -p
nicht unterstützt) verwenden Sie lsof
Sudo lsof -i tcp:3000
Für Centos 7 use
netstat -vanp --tcp | grep 3000
Finden:
[Sudo] lsof -i :3000
Töten:
kill -9 <PID>
Nichts hat für mich gearbeitet. Jeder andere mit meiner Erfahrung könnte folgendes versuchen (arbeitete für mich):
Lauf:
lsof -i :3000 (where 3000 is your current port in use)
dann den Status der gemeldeten PID überprüfen:
ps ax | grep <PID>
endlich "Beginne damit":
kill -QUIT <PID>
Ein Einzeiler, um die PID des Prozesses mithilfe von Port 3000 zu extrahieren und abzubrechen.
lsof -ti:3000 | xargs kill
Die -t-Markierung entfernt alles außer der PID aus der lsof-Ausgabe, wodurch es einfach ist, sie zu töten.
Sie können lsof -i:3000
verwenden.
Das ist "List Open Files". Dadurch erhalten Sie eine Liste der Prozesse sowie der verwendeten Dateien und Ports.
Erstellen Sie in Ihrem .bash_profile
eine Verknüpfung für den Prozess terminate
the 3000:
terminate(){
lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
}
Rufen Sie dann $terminate
auf, wenn es blockiert ist.
Um einen solchen Prozess gewaltsam zu beenden, verwenden Sie den folgenden Befehl
lsof -n -i4TCP:3000
Dabei ist 3000 die Portnummer, an der der Prozess ausgeführt wird
dies gibt die Prozess-ID (PID) .__ zurück und führt sie aus
kill -9 "PID"
Ersetzen Sie die PID durch die Nummer, die Sie nach dem ersten Befehl erhalten
lsof -P | grep ':3000' | awk '{print $2}'
Damit erhalten Sie nur die auf MacOS getestete PID.
Eine der Möglichkeiten, einen Prozess an einem Port zu beenden, ist die 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
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)
Führen Sie die Befehlszeile auf OS-X El Capitan aus:
kill -kill `lsof -t -i tcp:3000`
Die umgekehrte Option von lsof gibt nur die PID zurück.
Finde die offene Verbindung
lsof -i -P | grep -i "hören"
Töten nach Prozess-ID
töte -9 'PID'
Finde PID und brich den Prozess ab.
lsof -ti:3000 | xargs kill
Mögliche Wege, um dies zu erreichen:
oben
Mit dem Befehl top können Sie die Ressourcennutzung Ihres Systems und die Prozesse anzeigen, die die meisten Systemressourcen beanspruchen. Oben wird eine Liste der Prozesse angezeigt, wobei die Prozesse die meiste CPU oben verwenden.
ps
Der Befehl ps listet die laufenden Prozesse auf. Der folgende Befehl listet alle auf Ihrem System ausgeführten Prozesse auf:
ps -A
Sie können die Ausgabe auch über grep weiterleiten, um nach einem bestimmten Prozess zu suchen, ohne andere Befehle verwenden zu müssen. Der folgende Befehl würde nach dem Firefox-Prozess suchen:
ps -A | grep firefox
Die gebräuchlichste 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
Finden und töten:
Diese einzelne Befehlszeile ist einfach und funktioniert einwandfrei.
kill -9 $(lsof -ti tcp:3000)
Einfachste Lösung : Töten Sie mehrere Ports mit einem einzigen Zeilenbefehl.
kill $(lsof -t -i:3000,3001) // 3000 and 3001 are the ports to be freed
lsof -t -i: 3000
82500
isof-t-i: 3001
82499
isof-t-i: 3001.3000
82499 82500
töte $ (lsof -t -i: 3001,3000)
Beendet die Prozesse 82499 und 82500 mit einem einzigen Befehl.
lsof -t -i: 3000
isof-t-i: 3001
Sie können dies in package.json
-Skripten verwenden
"scripts": { "start": "kill $(lsof -t -i:3000,3001) && npm start" }
Mit sindresorhus 's fkill können Sie Folgendes tun:
$ fkill :3000
Zu ~/.bash_profile
hinzufügen:
function killTcpListen () {
kill -QUIT $(Sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}
Dann source ~/.bash_profile
und ausführen
killTcpListen 8080
Ich habe eine kleine Funktion dafür erstellt und füge sie zu deiner RC-Datei hinzu (.bashrc
, .zshrc
oder 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 kill-by-port 3000
eingeben, um Ihren Rails-Server zu beenden (wobei 3000 für jeden Port verwendet wird, auf dem er läuft).
andernfalls könnten Sie einfach kill -9 $(cat tmp/pids/server.pid)
aus dem Rails-Stammverzeichnis eingeben
Mit diesen beiden Befehlen können Sie den Serverprozess leichter finden und beenden
- lsof -wni tcp: 3000
- töte -9 pid
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 wollen Sie wahrscheinlich nicht beide töten.
In dieser Situation können Sie -sTCP:LISTEN
verwenden, um nur die PID von Prozessen anzuzeigen, die zuhören. In Kombination mit dem -t
terse-Format können Sie den Prozess automatisch abbrechen:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
lsof -i tcp:port_number
- listet den Prozess auf, der auf diesem Port ausgeführt wird
kill -9 PID
- bricht den Prozess ab
in deinem Fall wird es so sein
lsof -i tcp:3000
von Ihrem Terminal finden Sie die PID des Prozesses
kill -9 PID
Hier ist eine Helper-Bash-Funktion, um mehrere Prozesse nach Namen oder Port zu beenden
fkill() {
for i in [email protected];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 [email protected] sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}
Verwendungszweck:
$ fkill [process name] [process port]
Beispiel:
$ fkill someapp :8080 node :3333 :9000
Sie sollten dies versuchen. Diese Technik ist unabhängig vom Betriebssystem.
In Ihrer Anwendung befindet sich ein Ordner namens tmp, in dem sich ein weiterer Ordner mit dem Namen 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.
Sie können dies versuchen
netstat -vanp tcp | grep 3000
Wenn Sie einen Code-freien Weg wünschen - öffnen Sie den Aktivitätsmanager und erzwingen Sie den Kill-Knoten :)
Verwenden Sie den folgenden Befehl, um den Prozess an Port 3000 abzubrechen. kill $(lsof -t -i:3000)