it-swarm.com.de

Wie schließe ich einen offenen Port vom Terminal auf dem Mac?

Ich habe Port # 5955 von einer Java-Klasse aus geöffnet, um von einem Client aus zu kommunizieren. Wie schließe ich diesen Port, wenn ich fertig bin? und auch welcher Befehl kann mir anzeigen, ob der Port offen oder geschlossen ist?

138
user1667108
  1. Ermitteln Sie die Prozess-ID (PID), die die Portnummer (z. B. 5955) belegt, die Sie freigeben möchten

    Sudo lsof -i :5955
    
  2. Beenden Sie den Prozess, der den Port derzeit verwendet, mithilfe der PID

    Sudo kill -9 PID
    
294
Future2020

Um den Prozess zu finden, versuchen Sie Folgendes:

Sudo lsof -i :portNumber

Beenden Sie den Prozess, der den Port derzeit verwendet, mithilfe der PID

kill PID

und prüfen Sie dann, ob der Port geschlossen ist. Wenn nicht, probiere es aus:

kill -9 PID

Ich würde nur Folgendes tun, wenn der vorherige nicht funktioniert hat

Sudo kill -9 PID

Nur um sicher zu gehen. Je nachdem, wie Sie den Port geöffnet haben, spielt dies möglicherweise keine Rolle. 

23
oeste

Wie auch immer Sie den Port geöffnet haben, schließen Sie ihn auf dieselbe Weise. Wenn Sie beispielsweise ein Socket erstellt haben, binden Sie es an Port 0.0.0.0:5955 und nennen Sie listen, und schließen Sie das gleiche 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 lsof-Befehl ausführen (wenn ein Prozess ihn geöffnet hat, ist er offen; andernfalls ist er nicht), oder Sie können einfach versuchen, eine Verbindung zu ihm herzustellen, z.

nc localhost 5955

Wenn er sofort ohne Ausgabe zurückkehrt, ist der Port nicht geöffnet.

Es kann erwähnenswert sein, dass es technisch gesehen nicht ein offener Port ist, sondern eine Kombination aus Host und Port. Wenn Sie beispielsweise in ein LAN als 10.0.1.2 eingesteckt sind, können Sie einen Socket an 127.0.0.1:5955 oder 10.0.1.2:5955 binden, ohne dass sich der eine oder der andere auf 0.0.0.0 auswirkt : 5955, um beide gleichzeitig zu erledigen. Mit dem Befehl ifconfig können Sie alle IPv4- und IPv6-Adressen Ihres Computers anzeigen.

23
abarnert

Sie können diesen ersten Befehl auch verwenden, um einen Prozess zu beenden, der einen bestimmten Port besitzt:

Sudo netstat -ap | grep :<port_number>

Angenommen, dieser Prozess enthält Port8000TCP und führt dann den Befehl aus:

Sudo netstat -ap | grep :8000

gibt die Zeile aus, die dem Prozess entspricht, der den Port8000enthält, zum Beispiel:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

In diesem Fall istprocHoldingPortder Name des Prozesses, der den Port geöffnet hat,4683ist seine PID und8000(beachten Sie das es ist TCP) ist die Portnummer, die es enthält (die Sie schließen möchten).

Beenden Sie dann den Vorgang, indem Sie dem obigen Beispiel folgen:

kill  4683

Wie andere hier erwähnt haben, falls dies nicht funktioniert (Sie können versuchen, kill mit -9 als Argument zu verwenden):

kill -9 4683

Im Allgemeinen ist es besser, SIGKILL (-9) nicht zu senden, wenn Sie können.

Prost,

Kerl.

5
Guy Avraham

Ich verwende lsof in Kombination 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 einer beliebigen Stelle aus eingeben. Dadurch werden alle auf Port 3000 ausgeführten Prozesse beendet.

https://github.com/xtrasimplicity/killport

5
XtraSimplicity

sehr einfacher find port 5900: 

Sudo lsof -i :5900

dann 59553 als PID betrachten

Sudo kill 59553
4
flik

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.

1
Barmar

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

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

Ich habe die Referenz hier gefunden

1
Hasan A Yousef

Ich habe eine Funktion für diesen Zweck 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 frei werden. Denken Sie daran, die Portnummer in der letzten Zeile zu ändern.

1

Im Jahr 2018 funktionierte bei mir MacOS HighSierra: 

Sudo lsof -nPi: IhrePortNr

dann:

Sudo töte -9 deinePID-Nummer 

0
Gel Sisaed