Você está fazendo a pergunta errada aqui. Não é realmente possível simplesmente "fechar uma porta" de fora do aplicativo que abriu o soquete escutando. A única maneira de fazer isso é matar completamente o processo que possui a porta. Então, em cerca de um minuto ou dois, a porta ficará disponível novamente para uso. Aqui está o que está acontecendo (se você não se importa, pule para o final, onde mostrarei como matar o processo que possui uma porta específica):
Portas são recursos alocados pelo SO para diferentes processos. Isso é semelhante a perguntar ao SO por um ponteiro de arquivo. No entanto, ao contrário dos ponteiros de arquivo, somente UM processo por vez pode possuir uma porta. Através da interface do socket BSD, os processos podem fazer um pedido para escutar em uma porta, que o SO irá então conceder. O sistema operacional também garante que nenhum outro processo receba a mesma porta. A qualquer momento, o processo pode liberar a porta fechando o soquete. O SO irá então recuperar a porta. Como alternativa, se o processo terminar sem liberar a porta, o SO acabará recuperando a porta (embora isso não aconteça imediatamente: levará alguns minutos).
Agora, o que você deseja fazer (basta fechar a porta na linha de comando) não é possível por dois motivos. Primeiro, se fosse possível, significaria que um processo poderia simplesmente roubar o recurso de outro processo (a porta). Isso seria uma política ruim, a menos que restritas a processos privilegiados. A segunda razão é que não está claro o que aconteceria com o processo que possuía a porta se a deixássemos continuar em execução. O código do processo é escrito assumindo que possui este recurso. Se nós simplesmente o retirássemos, ele acabaria caindo sozinho, então os sistemas operacionais não permitem que você faça isso, mesmo que você seja um processo privilegiado. Em vez disso, você deve simplesmente matá-los.
De qualquer forma, aqui está como matar um processo que possui uma porta específica:
sudo netstat -ap | grep :<port_number>
Isso gerará a linha correspondente à porta de retenção do processo, por exemplo:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
Neste caso, procHoldingPort é o nome do processo que abriu a porta, 4683 é o seu pid, e 8000 (note que é TCP) é o número da porta que ele contém.
Então, olhe na última coluna, você verá /. Então execute isto:
kill <pid>
Se isso não funcionar (você pode verificar executando novamente o comando netstat). Faça isso:
kill -9 <pid>
Em geral, é melhor evitar enviar SIGKILL se puder. É por isso que eu digo para você tentar kill
antes de kill -9
. Apenas usando kill
envia o gentil SIGTERM.
Como eu disse, ainda levará alguns minutos para a porta reabrir, se você fizer isso. Eu não sei como acelerar isso. Se alguém o fizer, adoraria ouvir.