Vous posez en quelque sorte la mauvaise question ici. Il n'est pas vraiment possible de simplement "fermer un port" depuis l'extérieur de l'application qui a ouvert le socket qui l'écoute. La seule façon de le faire est de tuer complètement le processus qui possède le port. Ensuite, dans une minute ou deux, le port redeviendra disponible. Voici ce qui se passe (si cela ne vous intéresse pas, passez directement à la fin où je vous montre comment tuer le processus propriétaire d'un port particulier) :
Les ports sont des ressources allouées par le système d'exploitation à différents processus. Cela revient à demander au système d'exploitation un pointeur de fichier. Cependant, contrairement aux pointeurs de fichiers, seul UN processus à la fois peut posséder un port. Grâce à l'interface socket BSD, les processus peuvent demander à écouter un port, ce que le système d'exploitation leur accorde. Le système d'exploitation s'assurera également qu'aucun autre processus n'obtiendra le même port. À tout moment, le processus peut libérer le port en fermant le socket. Le système d'exploitation récupère alors le port. Alternativement, si le processus se termine sans libérer le port, le système d'exploitation finira par récupérer le port (bien que cela ne se produise pas immédiatement : cela prendra quelques minutes).
Maintenant, ce que vous voulez faire (simplement fermer le port à partir de la ligne de commande), n'est pas possible pour deux raisons. Premièrement, si cela était possible, cela signifierait qu'un processus pourrait simplement voler la ressource d'un autre processus (le port). Ce serait une mauvaise politique, sauf si elle est limitée aux processus privilégiés. La deuxième raison est qu'il n'est pas clair ce qui arriverait au processus qui possède le port si nous le laissons continuer à fonctionner. Le code du processus est écrit en supposant qu'il possède cette ressource. Si nous la lui enlevions simplement, il finirait par s'écraser tout seul, c'est pourquoi les systèmes d'exploitation ne vous laissent pas faire cela, même si vous êtes un processus privilégié. Au lieu de cela, vous devez simplement les tuer.
Quoi qu'il en soit, voici comment tuer un processus qui possède un port particulier :
sudo netstat -ap | grep :<port_number>
Cela produira la ligne correspondant au port de maintien du processus, par exemple :
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
Dans ce cas, procHoldingPort est le nom du processus qui a ouvert le port, 4683 est son pid, et 8000 (notez que c'est TCP) est le numéro de port qu'il détient.
Ensuite, regardez dans la dernière colonne, vous verrez /. Puis exécutez ceci :
kill <pid>
Si cela ne fonctionne pas (vous pouvez vérifier en relançant la commande netstat). Faites ceci :
kill -9 <pid>
En général, il est préférable d'éviter d'envoyer SIGKILL si vous le pouvez. C'est pourquoi je vous dis d'essayer kill
avant kill -9
. Il suffit d'utiliser kill
envoie le SIGTERM plus doux.
Comme je l'ai dit, il faudra encore quelques minutes pour que le port se rouvre si vous faites cela. Je ne connais pas de moyen d'accélérer le processus. Si quelqu'un d'autre le fait, je serais ravi de l'entendre.