Ich habe Port # 5955 von einer Java-Klasse aus geöffnet, um von einem Client aus zu kommunizieren. Wie schließe ich diesen Port, nachdem ich fertig bin? und auch welcher Befehl kann mir zeigen, ob Port offen oder geschlossen ist?
Ich habe Port # 5955 von einer Java-Klasse aus geöffnet, um von einem Client aus zu kommunizieren. Wie schließe ich diesen Port, nachdem ich fertig bin? und auch welcher Befehl kann mir zeigen, ob Port offen oder geschlossen ist?
Antworten:
Finden Sie die Prozess-ID (PID) heraus, die die Portnummer (z. B. 5955) belegt, die Sie freigeben möchten
sudo lsof -i :5955
Beenden Sie den Prozess, der derzeit den Port verwendet, mit seiner PID
sudo kill -9 PID
kill PID
(was -15 impliziert) und dann -2 und -1 versuchen. -9 ist nur dann der letzte Ausweg, wenn alle anderen Optionen nicht funktionieren.
Um den Prozess zu finden, versuchen Sie:
sudo lsof -i :portNumber
Beenden Sie den Prozess, der derzeit den Port verwendet, mit seiner PID
kill PID
und überprüfen Sie dann, ob der Port geschlossen ist. Wenn nicht, versuchen Sie:
kill -9 PID
Ich würde nur folgendes tun, wenn das vorherige nicht funktioniert hätte
sudo kill -9 PID
Nur um sicher zu gehen. Je nachdem, wie Sie den Port geöffnet haben, spielt dies möglicherweise keine Rolle.
Wie auch immer Sie den Port geöffnet haben, Sie schließen ihn auf die gleiche Weise. Wenn Sie beispielsweise einen Socket erstellt, an Port 0.0.0.0:5955 gebunden und listen aufgerufen haben, schließen Sie denselben Socket.
Sie können auch einfach den Prozess beenden, bei dem der Port geöffnet ist.
Wenn Sie herausfinden möchten, in welchem Prozess ein Port geöffnet ist, versuchen Sie Folgendes:
lsof -i :5955
Wenn Sie wissen möchten, ob ein Port geöffnet ist, können Sie denselben Befehl lsof ausführen (wenn ein Prozess ihn geöffnet hat, ist er geöffnet; andernfalls nicht), oder Sie können einfach versuchen, eine Verbindung zu ihm herzustellen, z.
nc localhost 5955
Wenn es sofort ohne Ausgabe zurückkehrt, ist der Port nicht geöffnet.
Es kann erwähnenswert sein, dass es sich technisch gesehen nicht um einen offenen Port handelt, sondern um eine Kombination aus Host und Port. Wenn Sie beispielsweise als 10.0.1.2 an ein LAN angeschlossen sind, können Sie einen Socket an 127.0.0.1:5955 oder 10.0.1.2:5955 binden, ohne dass sich einer auf den anderen auswirkt, oder Sie können an 0.0.0.0 binden : 5955, um beide gleichzeitig zu behandeln. Mit dem ifconfig
Befehl können Sie alle IPv4- und IPv6-Adressen Ihres Computers anzeigen .
Im Jahr 2018 hat Folgendes für mich mit MacOS HighSierra funktioniert:
sudo lsof -nPi: yourPortNumber
dann:
sudo kill -9 yourPIDnumber
lsof -nPi
ist etwas besser, da die Portnummer tatsächlich in der Ausgabe sichtbar ist und Sie ein besseres Gefühl dafür bekommen, was Sie töten.
sudo lsof -nPi | grep LISTEN
Mit diesem ersten Befehl können Sie auch einen Prozess beenden, der einen bestimmten Port besitzt:
sudo netstat -ap | grep :<port_number>
Angenommen, dieser Prozess enthält Port 8000 TCP und führt dann den folgenden Befehl aus:
sudo netstat -ap | grep :8000
gibt die Zeile aus, die dem Prozesshalteport 8000 entspricht , zum Beispiel:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
In diesem Fall ist procHoldingPort der Name des Prozesses, der den Port geöffnet hat, 4683 ist seine PID und 8000 (beachten Sie, dass es sich um TCP handelt) ist die Portnummer, die er enthält (die Sie schließen möchten).
Beenden Sie dann den Vorgang gemäß dem obigen Beispiel:
kill 4683
Wie andere hier erwähnt haben, wenn das nicht funktioniert (Sie können versuchen, kill mit -9 als Argument zu verwenden):
kill -9 4683
Auch hier ist es im Allgemeinen besser, das Senden von SIGKILL (-9) zu vermeiden, wenn Sie können.
Prost,
Kerl.
Ich benutze lsof
kombiniert mit kill
, wie oben erwähnt; schrieb aber ein kurzes kleines Bash-Skript, um diesen Prozess zu automatisieren.
Mit diesem Skript können Sie einfach killport 3000
von überall aus tippen und alle auf dem Port ausgeführten Prozesse werden abgebrochen 3000
.
lsof
in Kombination mit kill
nichts zurückgegeben und mein Skript unter macOS Sierra hängen gelassen. Funktioniert aber killport
wie ein Zauber und ist schneller. Vielen Dank!
Ich habe zu diesem Zweck eine Funktion erstellt.
function free_port() {
if [ -z $1 ]
then
echo no Port given
else
PORT=$1;
PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port
if [ -z $PID ]
then
echo port: $PORT is already free.
else
sudo kill -9 $PID # kill the process, which frees the port
echo port: $PORT is now free.
fi
fi
}
free_port 80 # you need to change this port number
Durch Kopieren und Einfügen dieses Codeblocks in Ihr Terminal sollte der gewünschte Port freigegeben werden. Denken Sie daran, die Portnummer in der letzten Zeile zu ändern.
Versuchen Sie es unten, vorausgesetzt, der laufende Port ist 8000
:
free-port() { kill "$(lsof -t -i :8000)"; }
Ich habe die Referenz hier gefunden
Ermitteln Sie zuerst die Procees-ID (pid), die den erforderlichen Port belegt hat (z. B. 5434).
ps aux | grep 5434
2. Beenden Sie diesen Prozess
kill -9 <pid>