Comment tuer un processus s'exécutant sur un port spécifique sous Linux
Dans certaines situations, vous pourriez avoir besoin d'arrêter un processus qui utilise un port réseau spécifique. Cela peut se produire si le processus se comporte mal, ou si vous devez libérer le port pour une autre application. Dans ce tutoriel détaillé, nous allons apprendre comment tuer un processus s'exécutant sur un port spécifique dans les systèmes d'exploitation Linux et similaires à Unix.
Introduction
Sous Linux, plusieurs processus peuvent s'exécuter simultanément, chacun pouvant utiliser différents ports réseau pour la communication. Parfois, un processus peut devenir non réactif ou bloqué, causant des problèmes avec l'application ou le service qu'il exécute. Dans de tels cas, vous devrez peut-être terminer ou « tuer » le processus pour libérer le port qu'il utilise.
Disons que vous avez un serveur web Apache fonctionnant sur votre machine Linux, et pour une raison quelconque, il est devenu non réactif. Apache fonctionne généralement sur le port 80 (HTTP) ou 443 (HTTPS). Si vous essayez d'accéder à votre site web et qu'il ne se charge pas, vous devrez peut-être tuer le processus Apache et le redémarrer.
Donc, si vous voulez trouver et terminer les processus non réactifs écoutant sur un certain port, vous pouvez utiliser les commandes fuser, lsof, netstat et ss comme décrit dans les sections suivantes.
Tuer un processus s'exécutant sur un port particulier avec la commande fuser
Tuer un processus s'exécutant sur un port particulier sous Linux peut être accompli en utilisant plusieurs méthodes. Une approche courante consiste à utiliser l'utilitaire de ligne de commande fuser.
La commande fuser (utilisateur de fichier) dans Linux est un utilitaire puissant qui aide à identifier les processus utilisant des fichiers, des sockets ou des systèmes de fichiers spécifiques. Elle est particulièrement utile pour résoudre des problèmes liés au verrouillage de fichiers, à la gestion des processus et aux ressources système.
La commande fuser fait partie du paquet psmisc, donc si elle n'est pas disponible sur votre système Linux, vous devrez peut-être installer le paquet psmisc en utilisant le gestionnaire de paquets de votre système.
Par exemple, exécutez la commande suivante pour installer psmisc sur Arch Linux et ses variantes comme EndeavourOS, Garuda Linux et Manjaro Linux :
$ sudo pacman -S psmiscSur les systèmes Debian, Ubuntu et dérivés :
$ sudo apt install psmiscSur Fedora, RHEL, Almalinux et Rocky Linux :
$ sudo dnf install psmiscSur SUSE/openSUSE :
$ sudo zypper install psmiscVoyons maintenant comment tuer un service ou un processus à l'écoute sur un port particulier en utilisant la commande fuser.
1. Identifier le processus utilisant le port :
Pour savoir quel processus utilise un port particulier, vous pouvez utiliser la commande fuser :
fuser <port_number>/tcpRemplacez <port_number> par le numéro de port réel. Par exemple, pour vérifier le port 8080 :
$ fuser 8080/tcpCette commande affichera les PID de tous les processus qui ont le port TCP 8080 ouvert.
2. Tuer le processus utilisant le port:
Une fois que vous avez le PID, vous pouvez tuer le processus avec :
$ fuser -k 8080/tcpL'option -k terminera (tuera) tous les processus qui ont le port TCP 8080 ouvert.
3. Lister les processus liés à un port UDP:
$ fuser 8080/udpCela listera les PID des processus qui ont le port UDP 8080 ouvert.
Veuillez noter que lorsque vous tuez un processus, le port qu'il utilisait peut ne pas devenir immédiatement disponible pour une réutilisation. Au lieu de cela, le port entre dans un état TIME_WAIT pendant environ 60 secondes avant d'être complètement fermé par le système d'exploitation. Ce délai est une mesure de sécurité pour prévenir une éventuelle corruption de données ou des conflits.
Si vous avez besoin de réutiliser le port plus tôt, vous pouvez configurer le nouveau processus ou l'application pour permettre la réutilisation du port en définissant les options de socket appropriées (par exemple, SO_REUSEADDR sur Linux).
Tuer un processus s'exécutant sur un port spécifique en utilisant la commande lsof
La commande lsof est un utilitaire puissant dans les systèmes d'exploitation Linux et de type Unix qui liste des informations sur les fichiers ouverts et les processus qui les ont ouverts.
Cela signifie « lister les fichiers ouverts », et cela fournit une vue complète des fichiers, répertoires, sockets réseau et autres ressources système utilisés par divers processus en cours d'exécution sur le système.
1. Identifier l'ID de processus (PID) utilisant le port
Tout d'abord, vous devez découvrir quel processus utilise le port. Vous pouvez utiliser la commande lsof (List Open Files) pour cela.
sudo lsof -i :<port_number>Remplacez <port_number> par le numéro de port réel. Par exemple, si vous voulez vérifier le port 8080, vous exécuteriez :
$ sudo lsof -i :8080Cette commande affichera les détails du processus utilisant le port 8080. Cherchez la colonne PID dans la sortie pour obtenir l'ID du processus.
2. Tuer le processus en utilisant le PID
Une fois que vous avez le PID, vous pouvez terminer le processus en utilisant la commande kill.
sudo kill -9 <PID>Remplacez <PID> par l'identifiant réel du processus. Par exemple, si le PID est 1234, vous exécuteriez :
$ sudo kill -9 1234L'option -9 envoie un signal SIGKILL, qui arrête le processus de force.
Scénario d'exemple
Imaginez que vous exécutez un serveur web sur le port 8080, mais que vous devez le redémarrer car il ne répond pas correctement. Voici comment vous pouvez le faire :
Trouver le processus utilisant le port 8080 :
$ sudo lsof -i :8080La sortie pourrait ressembler à ceci :
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1234 user 45u IPv6 65432 0t0 TCP *:http-alt (LISTEN)Ici, le processus utilisant le port 8080 est une application Java avec PID 1234.
Tuer le processus :
$ sudo kill -9 1234Cette commande arrête l'application Java fonctionnant sur le port 8080.
Commande lsof en une ligne pour terminer les processus liés à un port spécifique
Vous pouvez également utiliser une commande en ligne pour tuer un processus s'exécutant sur un port spécifique en utilisant lsof combiné avec la commande kill.
Voici la commande lsof en une seule ligne :
$ kill -9 $(lsof -t -i:8080 -sTCP:LISTEN)Décomposons cette instruction en une ligne et comprenons comment elle fonctionne :
lsof -t -i:8080 -sTCP:LISTEN: Cette partie de la commande utiliselsofpour lister les processus qui ont le port TCP 8080 ouvert et à l'étatLISTEN.
-t: Cette option indique àlsofd'afficher uniquement les identifiants de processus (PID) des processus correspondants.-i:8080: Cette option spécifie de rechercher les processus utilisant l'adresse Internet et le port spécifiés (dans ce cas, le port 8080).-sTCP:LISTEN: Cette option filtre les résultats pour n'afficher que les processus qui ont des sockets TCP dans l'étatLISTEN(c'est-à-dire qui écoutent activement sur le port).
$ (...): Cette partie de la commande est un sous-shell, ce qui signifie que la sortie de la commandelsofà l'intérieur des parenthèses est capturée et substituée dans la commande externe.kill -9: Cette partie de la commande utilise l'utilitairekillpour terminer les processus. L'option-9envoie le signalSIGKILL, qui est un signal de terminaison forcée qui ne peut pas être intercepté ou ignoré par le processus.
Ainsi, ce qui se passe, c'est que lsof trouve d'abord les ID de processus (PID) de tous les processus qui écoutent sur le port TCP 8080. La sortie (juste les PID) est ensuite substituée dans la commande kill -9, qui termine ces processus de force.
Cette commande en une ligne est concise et efficace, car elle combine les étapes d'identification et de terminaison du processus en une seule commande.
Il est important de l'utiliser avec prudence, car le signal SIGKILL peut potentiellement entraîner une perte de données ou d'autres conséquences inattendues s'il n'est pas utilisé correctement.
De plus, comme mentionné précédemment, tuer un processus peut ne pas libérer immédiatement le port en raison de l'état TIME_WAIT.
Si vous devez réutiliser le port immédiatement après avoir terminé le processus, vous devrez peut-être configurer le nouveau processus pour permettre la réutilisation du port ou attendre que l'état TIME_WAIT expire (généralement 60 secondes sur Linux).
Tuer un service à l'écoute sur un port particulier avec les commandes ss et netstat
Les commandes ss (statistiques des sockets) et netstat (statistiques réseau) peuvent également être utilisées pour identifier les services (ou processus) écoutant sur des ports spécifiques, avant de les terminer en utilisant la commande kill.
Utiliser ss, netstat et grep ensemble vous permet d'identifier rapidement les processus à l'écoute sur des ports spécifiques, puis de les terminer sélectivement en utilisant la commande kill.
Cette approche est particulièrement utile lorsque vous devez gérer des services réseau ou résoudre des conflits de ports sur les systèmes Linux.
Disons que vous avez une instance du serveur web Apache en cours d'exécution sur votre machine Linux, et que vous devez la terminer parce qu'elle est devenue non réactive ou que vous voulez libérer le port qu'elle utilise (généralement le port 80 pour HTTP ou 443 pour HTTPS).
Tout d'abord, laissez-moi vous montrer comment faire cela avec la commande netstat.
Utilisation de la commande netstat
La commande netstat est un utilitaire en ligne de commande qui affiche les connexions réseau, les tables de routage, les statistiques des interfaces, les connexions en mascarade et les adhésions multicast.
Cela fait longtemps qu'il fait partie des systèmes Linux et Unix et est largement utilisé pour le dépannage et la surveillance du réseau.
netstatsignifie « statistiques réseau » et est utilisé pour afficher diverses informations liées au réseau.- Il peut afficher les connexions TCP actives, les tables de routage, les statistiques des interfaces, et plus encore.
netstatprend en charge diverses options de filtrage, comme le filtrage par protocole, état, port, et plus encore.- Il fournit des informations sur les connexions réseau entrantes et sortantes.
- La sortie de
netstatpeut être plus difficile à lire et à interpréter par rapport àss.
Tout d'abord, vous pouvez utiliser netstat pour lister tous les processus à l'écoute sur les ports TCP et filtrer la sortie pour n'afficher que ceux liés à Apache :
$ sudo netstat -tnlp | grep -i apacheIci,
-taffiche les sockets TCP-nempêche la résolution des noms de service-laffiche uniquement les sockets en écoute-paffiche l'identifiant et le nom du processus| grep -i apachefiltre la sortie pour afficher les lignes contenant « apache » (insensible à la casse)
Cela devrait afficher une ligne similaire à :
tcp6 0 0 :::80 :::* LISTEN 12345/apache2Ici, 12345 est l'identifiant de processus (PID) du processus Apache écoutant sur le port 80.
Pour terminer ce processus, vous pouvez utiliser la commande kill avec le PID :
$ sudo kill 12345Si le processus ne se termine pas correctement, vous pouvez utiliser l'option -9 pour le tuer de force :
$ sudo kill -9 12345Utilisation de la commande ss
La commande ss est un utilitaire utilisé pour examiner les sockets sur un système Linux. C'est une alternative à l'ancienne commande netstat et elle fournit des informations plus détaillées sur les connexions réseau, les sockets à l'écoute et les statistiques des sockets.
sssignifie "statistiques des sockets" et est utilisé pour afficher les statistiques et les informations des sockets.- Il fournit des informations détaillées sur TCP, UDP, les sockets de domaine UNIX et les sockets bruts.
ssa un format de sortie plus convivial par rapport ànetstat.- Il prend en charge diverses options de filtrage, telles que le filtrage par protocole, état, port, et plus encore.
ssest généralement plus efficace et plus rapide quenetstat, car il n'a pas besoin d'analyser le système de fichiers/procpour obtenir des informations.
Listez tous les processus TCP en écoute et filtrez pour Apache :
$ sudo ss -tnlp | grep -i apache-taffiche les sockets TCP-nempêche la résolution des noms de service-laffiche uniquement les sockets en écoute-paffiche l'identifiant et le nom du processus| grep -i apachefiltre la sortie pour afficher les lignes contenant « apache » (insensible à la casse)
Cela devrait afficher une ligne similaire à :
LISTEN 0 4096 :::80 :::* users:(("apache2",pid=12345,fd=4))Encore une fois, 12345 est l'identifiant du processus Apache.
Terminez le processus en utilisant kill :
$ sudo kill 12345Ou, pour forcer à tuer :
$ sudo kill -9 12345Dans les exemples ci-dessus, nous utilisons netstat ou ss pour identifier le processus du serveur web Apache écoutant sur le port 80 (HTTP), puis le terminer en utilisant la commande kill avec l'ID de processus correspondant.
Cette approche peut être appliquée à tout autre service ou processus qui écoute sur un port spécifique de votre système Linux. Il suffit de remplacer « apache » dans la commande grep par le nom ou une partie du nom du service qui vous intéresse.
Alors que ss et netstat peuvent tous deux être utilisés pour obtenir des informations sur les connexions réseau et les sockets, ss est généralement considéré comme plus moderne et convivial. Cependant, netstat est toujours largement utilisé et disponible sur la plupart des systèmes Linux et Unix.
Encore une fois, je vous recommande vivement de faire preuve de prudence lorsque vous terminez des processus, en particulier lors de l'utilisation de l'option -9 (SIGKILL), car cela peut entraîner une perte de données ou d'autres conséquences inattendues si ce n'est pas utilisé avec précaution.
Assurez-vous toujours de terminer le bon processus et de comprendre les implications potentielles avant d'exécuter la commande kill.
Questions Fréquemment Posées (FAQ)
Q : Quel est le but de la commande fuser ?
A : La commande fuser (utilisateur de fichiers) est utilisée pour identifier les processus qui utilisent des fichiers, des répertoires, des systèmes de fichiers ou des sockets réseau (ports) spécifiques sur un système Linux. Elle est particulièrement utile pour résoudre des problèmes de verrouillage de fichiers, gérer les services réseau et identifier les processus qui peuvent empêcher les opérations sur les fichiers ou les répertoires.
Q : Comment puis-je utiliser fuser pour lister les processus liés à un port spécifique ?
A : Pour lister les processus liés à un port TCP, utilisez la commande fuser PORT/tcp. Par exemple, fuser 8080/tcp listera les identifiants de processus (PID) des processus utilisant le port TCP 8080. De même, fuser PORT/udp peut être utilisé pour les ports UDP.
Q : fuser peut-il terminer des processus liés à un port ?
A : Oui, l'option -k dans fuser vous permet de terminer (tuer) les processus associés à la ressource spécifiée, comme un fichier ou une socket réseau. Par exemple, fuser -k 8080/tcp tuera tous les processus utilisant le port TCP 8080.
Q : À quoi sert la commande lsof ?
A : La commande lsof (list open files) est utilisée pour lister les fichiers ouverts et les sockets réseau sur un système Linux, ainsi que les processus qui les ont ouverts. Elle est utile pour identifier les processus qui ont un fichier ou un port spécifique ouvert, ce qui peut être utile pour le dépannage et la gestion des services réseau.
Q : Comment puis-je utiliser lsof pour trouver les processus utilisant un port spécifique ?
A : Pour lister les processus utilisant un port spécifique avec lsof, utilisez la commande lsof -i:PORT. Par exemple, lsof -i:8080 listera tous les processus qui ont le port 8080 ouvert, quel que soit le protocole (TCP ou UDP).
Q : Quelles sont les différences entre ss et netstat ?
A : Les deux ss (statistiques des sockets) et netstat (statistiques réseau) sont utilisés pour afficher les connexions réseau, les sockets en écoute et les statistiques des sockets sur les systèmes Linux. Cependant, ss est généralement considéré comme plus moderne et plus convivial, avec un meilleur format de sortie et une mise en œuvre plus efficace. netstat est une commande plus ancienne mais toujours largement utilisée.
Q : Comment puis-je utiliser ss ou netstat pour trouver les processus écoutant sur un port spécifique ?
A : Pour lister les processus écoutant sur un port spécifique avec ss, utilisez la commande ss -tnlp | grep PORT. Par exemple, ss -tnlp | grep 8080 listera tous les processus TCP en écoute sur le port 8080. Pour netstat, utilisez netstat -tnlp | grep PORT.
Q : Puis-je tuer un processus directement depuis la sortie de ss ou netstat ?
A : Oui, vous pouvez utiliser une commande en ligne pour tuer un processus directement à partir de la sortie de ss ou netstat. Par exemple, kill -9 $ (lsof -t -i:8080 -sTCP:LISTEN) tuera tout processus écoutant sur le port TCP 8080.
Q : Quelle est la signification de l'option -9 dans la commande kill ?
A : L'option -9 dans la commande kill envoie le signal SIGKILL, qui termine le processus de force sans lui donner la possibilité de se nettoyer ou de sauvegarder des données. Cela doit être utilisé avec prudence, car cela peut entraîner une perte de données ou d'autres conséquences inattendues si ce n'est pas utilisé avec soin.
Q : Pourquoi un port pourrait-il ne pas être immédiatement disponible pour réutilisation après la terminaison d'un processus ?
A : Lorsque vous terminez un processus, le port qu'il utilisait peut ne pas devenir immédiatement disponible pour réutilisation. Au lieu de cela, le port entre dans un état TIME_WAIT pendant environ 60 secondes avant d'être complètement fermé par le système d'exploitation. Ce délai est une mesure de sécurité pour prévenir une éventuelle corruption de données ou des conflits.
Conclusion
Les commandes fuser, lsof, netstat et ss sont des outils puissants pour gérer les processus et les ports sur les systèmes Linux. Elles offrent un moyen pratique de identifier et de terminer les processus qui peuvent provoquer des problèmes ou des conflits, en particulier lorsqu'il s'agit d'applications ou de services liés au réseau.
Vous pouvez les utiliser dans les cas suivants :
- Libérer un port : Si vous devez exécuter une autre application sur le même port.
- Arrêter un processus qui se comporte mal : Si une application ne répond pas ou se comporte de manière inattendue.
- Redémarrage des services : Parfois, redémarrer un service en tuant son processus est plus rapide que de redémarrer le serveur.
Bien qu'il existe certainement d'autres méthodes pour atteindre ces objectifs, ces quatre commandes sont simplement suffisantes pour moi afin d'accomplir cette tâche.
Je suis également ouvert à écouter toutes vos suggestions. N'hésitez pas à mentionner vos suggestions dans la section des commentaires ci-dessous.
Lecture liée :
- Comment trouver quel service écoute sur un port particulier
- Comment trouver le numéro de port d'un service sous Linux