Guide complet de lsof sous Linux - Des conflits de ports à la libération d'espace disque des fichiers supprimés : astuces clés pour la pratique

Présentation générale

Les problèmes tels que les conflits de ports ou l’espace disque qui ne diminue pas après la suppression d’un fichier, fréquents lors de l’administration d’un système Linux, peuvent être résolus instantanément à l’aide de la commande lsof. Dans cet article, nous explorerons les techniques essentielles pour appliquer immédiatement lsof sur le terrain, dans un environnement Linux où « tout est fichier ». Du suivi des ports à la libération des verrous de fichiers, découvrez pas à pas le savoir-faire indispensable de dépannage pour les ingénieurs système.

Vérification de base de lsof et identification des fichiers ouverts par un utilisateur ou un processus spécifique

Pour vérifier si la commande lsof est installée sur le système et installer le paquet si ce n’est pas le cas, exécutez la commande command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof).

command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof)

Exécutez la commande lsof -v pour vérifier la version installée et les informations de compilation de la commande lsof.
⚙️ [Options principales]

-u : Affiche la liste des fichiers et processus ouverts par un compte utilisateur spécifique.
-c : Filtre la liste des fichiers ouverts par les processus dont le nom commence par la chaîne spécifiée.
-p : Vérifie la liste des fichiers ouverts par un identifiant de processus (PID) spécifique.
-i : Interroge les sockets réseau et les processus utilisant des ports spécifiques.
+D : Recherche récursivement la liste des fichiers ouverts dans le répertoire spécifié et ses sous-dossiers.
-t : Affiche uniquement les identifiants de processus (PID), de manière concise et ligne par ligne, ce qui est pratique pour l’intégration dans des scripts.

lsof -v

Pour préparer un répertoire de test et un fichier d’exemple pour la pratique de lsof, exécutez la commande mkdir -p /tmp/lsof_lab && echo '테스트 파일 내용' > /tmp/lsof_lab/sample.txt.

mkdir -p /tmp/lsof_lab && echo ‘테스트 파일 내용’ > /tmp/lsof_lab/sample.txt

Exécutez la commande tail -f /tmp/lsof_lab/sample.txt & pour qu’un processus maintienne ouvert le fichier d’exemple créé en arrière-plan.

tail -f /tmp/lsof_lab/sample.txt &

La commande lsof -u $(whoami) | head -n 15 affiche les 15 premières lignes de la liste des fichiers occupés par les processus exécutés par l’utilisateur actuellement connecté.
Vous pouvez ainsi examiner les détails des fichiers ouverts par le compte courant, y compris les bibliothèques système de base et les fichiers exécutables.

lsof -u $(whoami) | head -n 15

La commande lsof -c tail recherche et affiche la liste des fichiers et des bibliothèques ouverts par les processus dont le nom est tail.
Cela vous permet de vérifier quels descripteurs de fichiers et quelles bibliothèques partagées sont référencés par la commande tail exécutée en arrière-plan.

lsof -c tail

Une fois l’exercice terminé, exécutez la commande killall tail 2>/dev/null || true pour arrêter en toute sécurité et nettoyer le processus tail qui s’exécutait en arrière-plan.

killall tail 2>/dev/null || true

Vérification des ports réseau et dépannage des conflits de processus

Pour préparer l’environnement d’exercice de vérification des ports et de gestion des conflits de processus, vérifiez si python3 est installé sur le système, et installez le paquet s’il est absent.

command -v python3 >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y python3)

Pour tester l’occupation d’un port réseau, lancez en arrière-plan un serveur web simple sur le port 8080.

python3 -m http.server 8080 >/dev/null 2>&1 &

Attendez 1 seconde jusqu’à ce que le processus du serveur web exécuté en arrière-plan soit correctement lié au port 8080.

sleep 1

La commande lsof -i :8080 recherche le processus utilisant actuellement le port 8080.
Le résultat permet de constater que le processus python3 de PID 371 est en écoute avec l’état LISTEN sur le port 8080.

lsof -i :8080

La commande lsof -i -P -n | head -n 15 affiche rapidement la liste des sockets réseau du système sous forme numérique, sans conversion des numéros de port ni des adresses IP.
En évitant les résolutions DNS inverses et la correspondance des noms de ports de service, vous pouvez évaluer l’état d’occupation des ports sans aucun délai.

lsof -i -P -n | head -n 15

La commande lsof -i TCP:8080 -sTCP:LISTEN filtre précisément et affiche uniquement les connexions du protocole TCP se trouvant à l’état LISTEN sur le port 8080.
Elle s’avère particulièrement utile pour exclure les connexions de session superflues et identifier avec exactitude le processus démon en attente de connexions sur ce port.

lsof -i TCP:8080 -sTCP:LISTEN

Une fois la pratique terminée, forcez l’arrêt du processus du serveur web en arrière-plan qui occupait le port TCP 8080 afin de libérer les ressources mobilisées.

fuser -k 8080/tcp 2>/dev/null || kill $(lsof -t -i :8080) 2>/dev/null || true

Traçage d’un répertoire spécifique et des fichiers empêchant le démontage (Device Busy)

Pour reproduire une situation d’occupation de répertoire empêchant le démontage, créez un répertoire de test et déplacez-vous dans ce chemin.

mkdir -p /tmp/mount_test && cd /tmp/mount_test

Exécutez la commande echo '작업 중인 파일' > active_work.log afin de créer un fichier journal cible que le processus gardera ouvert.

echo ‘작업 중인 파일’ > active_work.log

Exécutez un processus sleep en arrière-plan en lui passant le fichier créé en entrée standard pour le maintenir continuellement ouvert.

sleep 30 < active_work.log &

Pour inspecter l’état depuis l’extérieur du répertoire occupé, basculez votre répertoire de travail vers le répertoire personnel.

cd /root || cd ~

La commande lsof +D /tmp/mount_test trace et affiche récursivement tous les fichiers et processus ouverts dans le répertoire spécifié et son arborescence.
Le résultat confirme que le processus sleep de PID 450 référence ce répertoire comme répertoire de travail actuel (cwd) et ouvre le fichier active_work.log en mode lecture (0r), ce qui constitue la cause empêchant le démontage.

lsof +D /tmp/mount_test

Une fois l’exercice terminé, arrêtez en toute sécurité le processus sleep d’arrière-plan qui occupait le répertoire et le fichier.

killall sleep 2>/dev/null || true

Supprimez l’ensemble du répertoire de test temporaire et de ses sous-fichiers utilisés pour l’exercice afin de nettoyer les ressources système.

rm -rf /tmp/mount_test

Récupération et nettoyage des fichiers fantômes (deleted) supprimés mais occupant toujours l’espace disque

Pour tester une fuite d’espace disque, créez un répertoire d’exercice ainsi qu’un fichier volumineux de test de 10 Mo.

mkdir -p /tmp/leak_test && dd if=/dev/zero of=/tmp/leak_test/large.img bs=1M count=10 >/dev/null 2>&1

Suivez en arrière-plan le fichier volumineux créé afin qu’un processus continue de conserver son descripteur.

tail -f /tmp/leak_test/large.img &

Supprimez de force le fichier volumineux sur le système de fichiers pour reproduire la fuite liée à un fichier fantôme.

rm -f /tmp/leak_test/large.img

La commande lsof | grep '(deleted)' | head -n 5' affiche la liste des fichiers qui ont été supprimés du système de fichiers mais qui restent ouverts par un processus, occupant ainsi toujours de l’espace disque.
Elle permet de localiser rapidement les fichiers fantômes et les processus associés pour lesquels l’espace disque n’est pas restitué malgré l’utilisation de la commande rm.

lsof | grep ‘(deleted)’ | head -n 5

À partir du PID extrait via lsof -t, consultez la liste des descripteurs de fichiers dans le répertoire /proc/$TARGET_PID/fd/.
En vérifiant directement le numéro de descripteur de fichier référencé par le processus, vous pouvez libérer l’espace sans redémarrer le processus ou, si nécessaire, récupérer les données d’origine supprimées à travers ce descripteur.

TARGET_PID=$(lsof -t /tmp/leak_test/large.img 2>/dev/null | head -n 1) && [ -n “$TARGET_PID” ] && ls -l /proc/$TARGET_PID/fd/ || true

Une fois l’exercice terminé, arrêtez en toute sécurité le processus d’arrière-plan qui maintenait le fichier fantôme ouvert afin de libérer complètement l’espace disque.

killall tail 2>/dev/null || true

Supprimez définitivement le répertoire temporaire utilisé pour les tests afin de libérer les ressources système.

rm -rf /tmp/leak_test

Nous venons de passer en revue les astuces concrètes incontournables offertes par la commande lsof, de la résolution des conflits de ports à la récupération d’espace disque occupé par des fichiers supprimés.
Espérons que ces éléments vous seront d’une aide précieuse pour résoudre vos problématiques lors de l’exploitation et du dépannage de vos serveurs.