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?
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?
Risposte:
Scopri l'ID processo (PID) che occupa il numero di porta (ad es. 5955) che desideri liberare
sudo lsof -i :5955
Termina il processo che sta attualmente utilizzando la porta usando il suo PID
sudo kill -9 PID
kill PID
(che implica -15), quindi provare -2 e -1. -9 è l'ultima risorsa solo se tutte le altre opzioni non funzionano.
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.
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 ifconfig
comando.
Nel 2018 ecco cosa ha funzionato per me usando MacOS HighSierra:
sudo lsof -nPi: yourPortNumber
poi:
sudo kill -9 yourPIDnumber
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.
sudo lsof -nPi | grep LISTEN
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
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.
Uso in lsof
combinazione conkill
, come menzionato sopra; ma ha scritto un breve script bash per automatizzare questo processo.
Con questo script, puoi semplicemente digitare killport 3000
da qualsiasi luogo e ucciderà tutti i processi in esecuzione sulla porta 3000
.
lsof
in combinazione con kill
non ha restituito nulla e ha reso il mio script bloccato su macOS Sierra. Ma killport
funziona come un fascino ed è più veloce. Grazie!
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.
prova di seguito, supponendo che la porta in esecuzione sia 8000
:
free-port() { kill "$(lsof -t -i :8000)"; }
Ho trovato il riferimento qui
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>