Stai facendo una domanda sbagliata qui. Non è davvero possibile semplicemente "chiudere una porta" dall'esterno dell'applicazione che ha aperto il socket in ascolto su di essa. L'unico modo per eseguire questa operazione è interrompere completamente il processo proprietario della porta. Quindi, tra circa un minuto o due, la porta sarà di nuovo disponibile per l'uso. Ecco cosa sta succedendo (se non ti interessa, passa alla fine dove ti faccio vedere come interrompere il processo con una determinata porta):
Le porte sono risorse allocate dal sistema operativo a diversi processi. Questo è simile a chiedere al sistema operativo un puntatore a file. Tuttavia, a differenza dei puntatori di file, solo UN processo alla volta può possedere una porta. Tramite l'interfaccia socket BSD, i processi possono effettuare una richiesta di ascolto su una porta, che verrà quindi concessa dal sistema operativo. Il sistema operativo assicurerà inoltre che nessun altro processo ottenga la stessa porta. In qualsiasi momento, il processo può rilasciare la porta chiudendo il socket. Il sistema operativo recupererà quindi la porta. In alternativa, se il processo termina senza rilasciare la porta, il sistema operativo alla fine recupererà la porta (anche se non accadrà immediatamente: ci vorranno alcuni minuti).
Ora, quello che vuoi fare (semplicemente chiudere la porta dalla riga di comando), non è possibile per due motivi. Innanzitutto, se fosse possibile, significherebbe che un processo potrebbe semplicemente rubare via la risorsa di un altro processo (la porta). Questa sarebbe una cattiva politica, a meno che non fosse limitata a processi privilegiati. La seconda ragione è che non è chiaro cosa succederebbe al processo che possedeva la porta se la lasciassimo continuare a funzionare. Il codice del processo è scritto presumendo che possiede questa risorsa. Se lo togliessimo semplicemente, finirebbe per andare in crash da solo, quindi i sistemi operativi non ti consentono di farlo, anche se sei un processo privilegiato. Invece, devi semplicemente ucciderli.
Ad ogni modo, ecco come terminare un processo che possiede una determinata porta:
sudo netstat -ap | grep :<port_number>
Ciò produrrà la linea corrispondente alla porta di mantenimento del processo, 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 (nota che è TCP) è il numero di porta che contiene.
Quindi, guarda nell'ultima colonna, vedrai /. Quindi eseguire questo:
kill <pid>
Se ciò non funziona (è possibile verificare rieseguendo il comando netstat). Fai questo:
kill -9 <pid>
In generale, è meglio evitare di inviare SIGKILL se è possibile. Ecco perché ti dico di provare kill
prima kill -9
. Solo usando kill
invia il SIGTERM più gentile.
Come ho detto, ci vorranno ancora alcuni minuti per riaprire la porta se lo fai. Non conosco un modo per accelerare questo. Se lo fa qualcun altro, mi piacerebbe ascoltarlo.