Wie schließe ich einen offenen Port vom Terminal des Mac aus?

197

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?

user1667108
quelle
1
Wie haben Sie diesen Hafen geöffnet? Es ist nicht klar, ob Sie über das Öffnen und Schließen der Ports in der Java-Anwendung oder über die Firewall sprechen.
Mariosangiorgio

Antworten:

394
  1. Finden Sie die Prozess-ID (PID) heraus, die die Portnummer (z. B. 5955) belegt, die Sie freigeben möchten

    sudo lsof -i :5955
    
  2. Beenden Sie den Prozess, der derzeit den Port verwendet, mit seiner PID

    sudo kill -9 PID
    
Future2020
quelle
32
Das Senden von -9 sollte nicht der erste Versuch sein, einen Prozess zu beenden, und es ist eine sehr schlechte Angewohnheit. Soweit ich mich erinnere, sollten Sie zuerst nur kill PID(was -15 impliziert) und dann -2 und -1 versuchen. -9 ist nur dann der letzte Ausweg, wenn alle anderen Optionen nicht funktionieren.
Miau
3
hat pID ohne Flaggen getötet, wie von @Meow vorgeschlagen, und das hat bei mir funktioniert
Toni Leigh
39

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.

oeste
quelle
25

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 ifconfigBefehl können Sie alle IPv4- und IPv6-Adressen Ihres Computers anzeigen .

abarnert
quelle
24

sehr einfach Port 5900 finden:

sudo lsof -i :5900

dann 59553 als PID betrachten

sudo kill 59553
flik
quelle
1
Dies fügt den vorhandenen Antworten nichts hinzu!
Hass
16

Im Jahr 2018 hat Folgendes für mich mit MacOS HighSierra funktioniert:

sudo lsof -nPi: yourPortNumber

dann:

sudo kill -9 yourPIDnumber

Gel
quelle
1
lsof -nPiist 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.
Rich Stone
1
Auch hilfreich, um alle Informationen zu den sudo lsof -nPi | grep LISTEN
Abhörports
14

Ein Liner ist am besten

kill -9 $(lsof -i:PORT -t) 2> /dev/null

Beispiel: Auf dem Mac wollte Port 9604 löschen. Der folgende Befehl funktionierte wie ein Zauber

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 
Amitesh
quelle
6

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.

Guy Avraham
quelle
5

Ich benutze lsofkombiniert 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 3000von überall aus tippen und alle auf dem Port ausgeführten Prozesse werden abgebrochen 3000.

https://github.com/xtrasimplicity/killport

XtraSimplicity
quelle
1
Du hast meinen Tag gerettet. Aus irgendeinem Grund hat lsofin Kombination mit killnichts zurückgegeben und mein Skript unter macOS Sierra hängen gelassen. Funktioniert aber killportwie ein Zauber und ist schneller. Vielen Dank!
Ohne
4

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.

Md. Khairul Islam
quelle
3

Versuchen Sie es unten, vorausgesetzt, der laufende Port ist 8000:

free-port() { kill "$(lsof -t -i :8000)"; }

Ich habe die Referenz hier gefunden

Hasan A Yousef
quelle
1

Wenn das Programm, das den Port geöffnet hat, beendet wird, wird der Port automatisch geschlossen. Wenn Sie den Java-Prozess beenden, auf dem dieser Server ausgeführt wird, sollte dies der Fall sein.

Barmar
quelle
-1
  1. 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>
Ashutosh Gupta
quelle