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 :
- Comment lister les ports réseau utilisés par des processus en écoute ?
- Comment mettre fin à un processus d’écoute ?
- 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« .
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 ».
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.
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 »
merci pour votre assistance
Très bien et très utile ! Bon boulot ! Merci !