Vous êtes en quelque sorte de poser la mauvaise question ici. Il n'est pas vraiment possible de simplement "fermer un port" de l'extérieur de l'application qui a ouvert le socket en l'écoutant. La seule façon de procéder consiste à supprimer complètement le processus propriétaire du port. Ensuite, dans environ une minute ou deux, le port redeviendra disponible. Voici ce qui se passe (si vous ne vous en souciez pas, passez à la fin où je vous montrerai comment arrêter le processus possédant un port particulier):
Les ports sont des ressources allouées par le système d'exploitation à différents processus. Ceci est similaire à demander au système d'exploitation un pointeur de fichier. Cependant, contrairement aux pointeurs de fichier, un seul processus à la fois peut posséder un port. Grâce à l'interface de socket BSD, les processus peuvent demander à écouter sur un port, ce que le système d'exploitation accorde ensuite. Le système d'exploitation s'assurera également qu'aucun autre processus n'obtient le même port. À tout moment, le processus peut libérer le port en fermant le socket. Le système d'exploitation récupérera alors le port. Alternativement, si le processus se termine sans libérer le port, le système d'exploitation le récupérera éventuellement (bien que cela ne se produise pas immédiatement: cela prendra quelques minutes).
Maintenant, ce que vous voulez faire (fermer simplement 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 tout simplement dérober 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 que nous ne savons pas ce qui arriverait au processus qui appartenait au port si nous le laissions continuer à fonctionner. Le code du processus est écrit en supposant qu'il possède cette ressource. Si nous l'enlevions simplement, le système s'écraserait tout seul. Les systèmes d'exploitation ne vous le permettent pas, 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 supprimer un processus possédant un port particulier:
sudo netstat -ap | grep :<port_number>
Cela affichera la ligne correspondant au port de traitement 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 qu'il s'agit de TCP) est le numéro de port qu'il détient.
Ensuite, regardez dans la dernière colonne, vous verrez /. Ensuite, exécutez ceci:
kill <pid>
Si cela ne fonctionne pas (vous pouvez vérifier en réexécutant la commande netstat). Faire ceci:
kill -9 <pid>
En général, il vaut mieux éviter d'envoyer SIGKILL si vous le pouvez. C'est pourquoi je vous dis d'essayer kill
avant kill -9
. Simplement utiliser kill
envoie le SIGTERM plus doux.
Comme je l'ai dit, la réouverture du port prendra encore quelques minutes si vous procédez ainsi. Je ne sais pas comment accélérer cela. Si quelqu'un d'autre le fait, j'aimerais l'entendre.