Catégories
Développement

Libérer un port réseau occupé par un processus Windows

Il est parfois impossible de redémarrer un logiciel serveur Windows qui écoute sur un port réseau précis. En effet, suite à un plantage ou une tentative d’arrêt / relance, vous pouvez rencontrer une erreur de port réseau déjà occupé. Par exemple, votre serveur TOMCAT qui écoutait sur le port 8080 plante et lorsque vous tentez de le redémarrer, il refuse en inscrivant dans le fichier de log « Port 8080 is not available ». Dans cet article nous verrons une solution plus élégante que le reboot de la machine serveur.

Il existe une solution alternative au bon vieux reboot de la machine. Ce que nous verrons dans l’ordre :

  1. Comment lister les ports réseau utilisés par des processus en écoute ?
  2. Comment mettre fin à un processus d’écoute ?
  3. Comment fermer une connexion lorsque le processus n’existe plus ou n’est pas affiché dans le gestionnaire des tâches de Windows ?

Lister les ports attachés à un processus d’écoute

Il existe plusieurs moyens pour connaître les processus ou les programmes exécutables écoutant sur un port. On peut accélérer la sortie de netstat en ajoutant des filtres (par exemple, pour le protocole tcp : -p tcp).

Liste des PID écoutant sur un port réseau (option rapide) :

>netstat -ano
Proto  Adresse locale    Adresse distante     Etat
TCP  10.18.187.91:1163   11.22.251.233:1026   ESTABLISHED   3456
TCP  10.18.187.91:1172   11.22.248.21:1632    ESTABLISHED   3456
TCP  10.18.187.91:19156  11.115.28.108:80     CLOSE_WAIT    3564
TCP  10.18.187.91:20495  11.127.23.247:445    ESTABLISHED   4
TCP  10.18.187.91:23884  11.123.248.21:1628   ESTABLISHED   3456

Liste des programmes exécutables écoutant sur un port réseau (option lente. Notez que l’option b n’existe que pour Windows) :

>netstat -ab

TCP mon-ordinateur:23884   11.22.248.22:1628 ESTABLISHED 3456
[OUTLOOK.EXE]
TCP mon-ordinateur:31532   11.22.248.22:1576 ESTABLISHED 3456
[OUTLOOK.EXE]
TCP mon-ordinateur:32512   11.152.156.180:8080  ESTABLISHED 2272
[netsession_win.exe]
TCP mon-ordinateur:36088   11.152.156.180:8080  ESTABLISHED 2612
[chrome.exe]

Mettre fin à un processus d’écoute

Si le processus est toujours actif, mais pas accessible par une interface graphique (par exemple un processus lancé par un programme tiers), on peut le tuer avec le gestionnaire des tâches de Windows (en choisissant terminer l’arborescence du processus) ou, avec l’utilitaire Process Explorer, l’option « Kill Process Tree« .

Terminer l'arborescence du processus avec le gestionnaire des tâches
Terminer l’arborescence du processus avec le gestionnaire des tâches

Mettre fin à un processus d’écoute qui n’existe plus

Le problème est que, certaines fois, netstat liste un processus écoutant un port, mais qu’il n’apparaît plus dans le gestionnaire des tâches. Dans ce cas, la connexion réseau reste ouverte (ou disons affectée exclusivement à un processus) et aucun autre programme ne peut écouter sur le port correspondant.

TCPView à la rescousse

TCPView est un logiciel qui liste les connexions réseau ouvertes et les PID / exécutables associés à chaque connexion. Il permet également de fermer une connexion lorsque le processus n’existe plus.

Dans certains cas, un processus Windows peut être terminé, mais le port réseau sur lequel il écoutait peut rester connecté. Lors d’un prochain lancement de l’exécutable créateur de ce processus, il plantera à cause d’un problème de port non disponible.

Le symptôme typique et qu’une commande de type netstat -ano ou netstat -ab va lister le processus alors qu’il n’est plus listé dans les processus actifs de Windows (via le gestionnaire des tâches, par exemple).

Pour corriger le problème et au lieu de redémarrer le serveur, installer TCPView, trouver la ligne du processus incriminé, faire un clic droit et choisir « Close connection ».

Fermer une connexion réseau avec TCPView
Fermer une connexion réseau avec TCPView

ProcessExplorer et les processus orphelins

Je vous fais part d’une observation bizarre que je n’arrive pas à expliquer…

Ce qui peut aussi arriver, c’est que votre processus – qui utilisait un port réseau – a planté ou est sorti sans fermer le port explicitement. Normalement l’OS nettoie ce genre de chose, mais seulement quand l’entrée de processus disparaît de la table des processus. Alors que le processus n’apparaît plus pas comme étant en cours d’exécution, il y a une chose qui empêche la suppression de l’entrée dans la table des processus : l’existence d’un processus enfant qui n’est pas détaché du parent.

Si votre programme a engendré des processus enfants tandis qu’il fonctionnait et qu’ils ne sont pas correctement détachés, essayez de les tuer. Cela devrait supprimer l’entrée de processus de la table des processus et donc libérer le port réseau. Apparemment, Windows ne libèrerait pas systématiquement les connexions réseau en sortie de processus (parent), mais seulement lorsque le processus est supprimé de la table des processus…

Pour résoudre ce problème, ouvrir Process Explorer et supprimer les processus orphelins qui ne sont pas liés au système. Les processus orphelins sont alignés à gauche dans l’arbre des processus.

Terminer l'arborescence du processus avec Process Explorer
Terminer l’arborescence du processus avec Process Explorer

Astuces de développement

Dans le cas d’un développement spécifique, il se peut que vous rencontriez des problèmes de mise au point. En effet, imaginons que vous déboguiez un processus serveur qui écoute sur un port réseau, mais que sa finalisation soit vraiment galère au point de l’arrêter et de le relancer plusieurs fois d’affilée. Il est donc possible de vous retrouver bloqué à cause des explications listées plus haut. Pour éviter les manipulations fastidieuses de cet article, utilisez l’option SO_REUSEADDR au moment de l’ouverture du socket. Cette option n’ouvrira pas le socket en mode exclusif et ainsi vous ne serez pas bloqué dans votre développement.

Il vaudrait mieux, à l’issue de votre débogage, ouvrir la connexion avec l’option explicite. Le fonctionnement de l’option non exclusive n’étant pas déterministe (n’importe quel autre processus lancé sur la même machine pouvant écouter sur ce port sans provoquer d’erreur système).

2 réponses sur « Libérer un port réseau occupé par un processus Windows »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.