Come posso chiudere una porta aperta dal terminale sul Mac?


199

Ho aperto la porta # 5955 da una classe Java per comunicare da un client. Come chiudo questa porta dopo aver finito? e anche quale comando può mostrarmi se la porta è aperta o chiusa?


1
Come hai aperto quella porta? Non è chiaro se si sta parlando di apertura e chiusura delle porte nell'applicazione java o dal firewall.
mariosangiorgio,

Risposte:


398
  1. Scopri l'ID processo (PID) che occupa il numero di porta (ad es. 5955) che desideri liberare

    sudo lsof -i :5955
    
  2. Termina il processo che sta attualmente utilizzando la porta usando il suo PID

    sudo kill -9 PID
    

33
L'invio di -9 non dovrebbe essere il primo tentativo di uccidere un processo, ed è una pessima abitudine. Come ricordo, dovresti prima usare kill PID(che implica -15), quindi provare -2 e -1. -9 è l'ultima risorsa solo se tutte le altre opzioni non funzionano.
Meow,

3
ha ucciso PID senza bandiere come suggerito da @Meow e questo ha funzionato per me
Toni Leigh

40

Per trovare il processo prova:

sudo lsof -i :portNumber

Termina il processo che sta attualmente utilizzando la porta usando il suo PID

kill PID

e quindi controlla se la porta è chiusa. In caso contrario, prova:

kill -9 PID

Farei quanto segue se il precedente non funzionasse

sudo kill -9 PID

Giusto per essere al sicuro. Ancora una volta, a seconda di come hai aperto la porta, questo potrebbe non avere importanza.


26

Comunque hai aperto la porta, la chiudi allo stesso modo. Ad esempio, se si crea un socket, lo si collega alla porta 0.0.0.0:5955 e si chiama in ascolto, chiudere lo stesso socket.

Puoi anche semplicemente terminare il processo che ha la porta aperta.

Se vuoi scoprire quale processo ha una porta aperta, prova questo:

lsof -i :5955

Se vuoi sapere se una porta è aperta, puoi fare lo stesso comando lsof (se un processo lo ha aperto, è aperto; altrimenti non lo è), oppure puoi semplicemente provare a connetterti ad esso, ad esempio:

nc localhost 5955

Se ritorna immediatamente senza output, la porta non è aperta.

Vale la pena ricordare che, tecnicamente parlando, non è una porta aperta, ma una combinazione host: port. Ad esempio, se si è collegati a una LAN come 10.0.1.2, è possibile associare un socket a 127.0.0.1:5955 o 10.0.1.2:5955, senza che l'uno influisca sull'altro o si potrebbe associare a 0.0.0.0 : 5955 per gestirli entrambi contemporaneamente. Puoi vedere tutti gli indirizzi IPv4 e IPv6 del tuo computer con il ifconfigcomando.


24

trova molto semplice la porta 5900:

sudo lsof -i :5900

quindi considerando 59553 come PID

sudo kill 59553

1
Questo non aggiunge nulla alle risposte esistenti!
hatef,

16

Nel 2018 ecco cosa ha funzionato per me usando MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

poi:

sudo kill -9 yourPIDnumber


1
lsof -nPiè leggermente migliore perché il numero di porta è effettivamente visibile nell'output e si ha una migliore sensazione di ciò che si sta uccidendo.
Rich Stone,

1
Utile anche solo per vedere tutte le informazioni sulle porte di ascolto:sudo lsof -nPi | grep LISTEN
leanne,

15

Una fodera è la migliore

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

Esempio: su Mac, volevo cancellare la porta 9604. Il seguente comando funzionava come un incantesimo

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

6

Puoi anche usare questo primo comando per terminare un processo che possiede una determinata porta:

sudo netstat -ap | grep :<port_number>

Ad esempio, supponiamo che questo processo contenga la porta 8000 TCP, quindi eseguendo il comando:

sudo netstat -ap | grep :8000

produrrà la linea corrispondente alla porta di trattenimento del processo 8000 , ad esempio:

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

In questo caso, procHoldingPort è il nome del processo che ha aperto la porta, 4683 è il suo pid e 8000 (si noti che è TCP) è il numero di porta che detiene (che si desidera chiudere).

Quindi uccidi il processo, seguendo l'esempio sopra:

kill  4683

Come altri menzionati qui, se non funziona (puoi provare a usare kill con -9 come argomento):

kill -9 4683

Ancora una volta, in generale, è meglio evitare di inviare SIGKILL (-9) se è possibile.

Saluti,

Tipo.


5

Uso in lsofcombinazione conkill , come menzionato sopra; ma ha scritto un breve script bash per automatizzare questo processo.

Con questo script, puoi semplicemente digitare killport 3000da qualsiasi luogo e ucciderà tutti i processi in esecuzione sulla porta 3000.

https://github.com/xtrasimplicity/killport


1
Mi hai salvato la giornata. Per qualche motivo lsofin combinazione con killnon ha restituito nulla e ha reso il mio script bloccato su macOS Sierra. Ma killportfunziona come un fascino ed è più veloce. Grazie!
wout

4

Ho creato una funzione per questo scopo.

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

Copia e incolla questo blocco di codice nel tuo terminale dovrebbe liberare la porta desiderata. Ricorda solo di cambiare il numero di porta nell'ultima riga.


3

prova di seguito, supponendo che la porta in esecuzione sia 8000:

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

Ho trovato il riferimento qui


1

Quando il programma che ha aperto la porta viene chiuso, la porta verrà chiusa automaticamente. Se si interrompe il processo Java che esegue questo server, dovrebbe farlo.


-1
  1. Per prima cosa scopri l'ID Procees (pid) che ha occupato la porta richiesta (es. 5434)

    ps aux | grep 5434

2. Uccidi quel processo

   kill -9 <pid>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.