Menu Fermer

lsof sur Linux : utilisations et exemples

La commande lsof est une commande de base disponible sur toutes les distributions Linux.
Elle correspond à ls (lister) et open files soit donc la commande pour lister les fichiers ouverts. Fondamentalement, elle donne les informations pour trouver les fichiers ouverts et par quel processus.
Lorsque vous utilisez la commande lsof, elle énumère tous les fichiers ouverts dans le système et les affiche dans la sortie du terminal

L’utilitaire n’énumère pas que les fichiers du disque, mais aussi les répertoires, les fichiers de bloc, les librairies partagées, les sockets réseaux, les points de montages, fichiers NFS et bien d’autres.
On peut la combiner avec la commande Grep pour chercher des fichiers spécifiques.

Dans ce tutoriel, je vous montre comment utiliser la commande lsof avec de nombreux exemples.

Comment utiliser la commande lsof sur Linux avec des exemples pour lister les fichiers ouverts

Comment utiliser la commande lsof

Linux / Unix considérons tout comme fichier et maintenance dossier. Donc, “fichiers ou fichier” est très important dans Linux / Unix. Tout en travaillant dans le système Linux / Unix, plusieurs fichiers et dossiers sont utilisés, certains d’entre eux seraient visibles et certains non.

lsof [option][user name]

lsof peut lister les fichiers ouverts provenant de processus système.
Il convient donc de l’utiliser avec sudo pour obtenir les permissions, sinon un message opendir: Permission denied s’affiche.

Comment utiliser lsof sur Linux

Les colonnes de lsof

  • Command : Nom de la commande associée au processus qui a ouvert le fichier
  • PID : Numéro d’identification de processus du processus qui a ouvert le fichier
  • TID (Task/Thread Identification number) : Une colonne vierge signifie que ce n’est pas une tâche; C’est un processus.
  • User : ID utilisateur ou nom de l’utilisateur à qui le processus appartient, ou l’ID utilisateur ou la connexion de la personne qui possède le répertoire dans /proc où lsof trouve des informations sur le processus.
  • FD : Affiche le descripteur de fichier du fichier. Les descripteurs de fichiers sont décrits ci-dessous
  • Type : Type de nœud associé au fichier. Les types de notes sont décrits ci-dessous
  • Device : Contient les numéros de périphérique, séparés par des virgules, pour un fichier spécial de caractère, bloquez un fichier spécial, régulier, répertoire ou NFS ou une adresse de référence du noyau identifiant le fichier. Il peut également montrer l’adresse de base ou le nom du périphérique d’un dispositif de prise Linux AX.25
  • Size/Off : Affiche la taille du fichier ou le décalage de fichier en octets
  • Node : Affiche le numéro du nœud d’un fichier local ou le numéro d’inode d’un fichier NFS dans le type d’hôte du serveur ou de protocole Internet. Il peut afficher STR pour un flux ou l’IRQ ou le numéro d’inode d’un dispositif de prise Linux AX.25
  • Name : Indique le nom du point de montage et du système de fichiers sur lequel réside le fichier

FD (file descriptor) donne une description du fichier, voici les plus communs :

  • cwd (Current Working Directory) – Repertoire de travail courant
  • txt (Text files) – Fichiers Texte
  • mem (Memory mapped file) – Fichier mappé en mémoire
  • mmap (Memory mapped device) – Périphérique mappé en mémoire
  • NUMBER – Le descripteur de fichier réel. Il dispose également d’informations sur la permission du fichier qu’il est ouvert dans.

TYPE correspond au type de fichier :

  • REG Regular file – Fichier régulier
  • DIR Directory – Répertoire
  • CHR Character special file – Fichier avec caractère spécial
  • FIFO First In First Out

lsof : utilisations et exemples

Comment voir les processus qui ont ouvert un fichier

Pour visualiser les processus qui ouvre un fichier spécifique, utilisez la commande lsof suivi par le chemin du fichier :

lsof <chemin_fichier>

Par exemple pour savoir ce qui ouvre le fichier /var/log/messages :

sudo lsof /var/log/messages
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
rsyslogd 594 root   11w   REG    8,1    59087 112200030 /var/log/messages
Comment voir les processus qui ont ouvert un fichier avec lsof

Comment lister les fichiers ouverts par un processus

L’option -c donne la possibilité de lister les fichiers ouvert d’un processus en spécifiant le nom de la commande.

sudo lsof -c <commande processus>

Par exemple pour lister les fichiers ouverts par le processus SSH et init :

sudo lsof -c ssh -c init
Comment lister les fichiers ouverts par un processus avec lsof

Mais on peut aussi utiliser l’option -p en spécifiant le PID du processus :

lsof -p <pid>

Comment voir tous les fichiers ouverts dans un répertoire

Si vous vous demandez lequel des fichiers ont été ouverts dans un certain répertoire, vous pouvez utiliser la commande lsof avec option +D.

sudo lsof +D <chemin_fichier>

Par exemple pour lister tous les fichiers ouverts dans le répertoire /var/log/ :

sudo lsof +D /var/log/
Comment voir tous les fichiers ouverts dans un répertoire avec lsof

Voir les fichiers ouverts par un utilisateur

Il est aussi utile de pouvoir visualiser l’intégralité des fichiers ouverts par un utilisateur.
Cela est possible avec l’option -u :

lsof -u <nom_utilisateur>

Par exemple pour lister les fichiers ouverts par l’utilisateur debian :

lsof -u debian

L’option -u prend aussi plusieurs utilisateurs en les séparant par des virgules :

lsof -u utilisateur1, utilisateur2
Voir les fichiers ouverts par un utilisateur avec lsof

Trouver les fichiers ouverts par un utilisateur et une commande ou un processus

Vous pouvez combiner des options telles que l’utilisateur et la commande et un processus à l’aide de l’option -a.
Cela fonctionne comme un opérateur AND. Cela vous donne un filtre supplémentaire pour essayer de réduire les résultats de recherche.

Voici la syntaxe :

lsof -a -u <nom utilisateur> -c <nom commande>

Par exemple pour lister les fichiers ouverts par la commande ssh pour l’utilisateur debian :

lsof -a -u debian -c ssh
Trouver les fichiers ouverts par un utilisateur et une commande ou un processus

Lister les connexions réseaux et ports ouverts

Vous pouvez également utiliser la commande LSOF pour trouver des ports ouverts ou pour rechercher quel processus utilise un port.

sudo lsof -i

Pour lister toutes les connexions TCP avec lsof :

sudo lsof -i tcp
Lister les connexions réseaux et ports ouverts

Pour lister les connexions UDP :

sudo lsof -i udp

De plus, on peut filtrer la liste des connexions réseaux par le processus SSH :

lsof -i -a -c ssh
Lister les connexions réseaux et ports ouverts

Et si vous souhaitez spécifier le PID, utilisez l’option -p :

sudo lsof -i -a -p 606

Enfin pour lister les connexions sur un port réseau spécifique ainsi que les ports en écoute (port ouvert) :

sudo lsof -i :<numéro port>

Par exemple pour lister les connexions SSH et vérifier si le port 22 est ouvert et en écoute :

sudo lsof -i :22
Lister les connexions réseaux et ports ouverts

Notez qu’un intervalle de ports réseau est possible :

sudo lsof -i :0-1024

Pour lister les connexions réseaux sur Linux, vous pouvez utiliser la commande netstat :

Comment lister les fichiers ouverts d’un processus parent et enfant (récursif)

Il existe un grand nombre de processus dans un système qui ouvrent beaucoup de fichiers pour leur fonctionnement.
Il peut y avoir de nombreux processus d’enfants d’un processus et ce processus peut également être qualifié de processus parent.
Pour connaître la liste des fichiers ouverts par la commande ID de processus parent, la commande lsof est utilisée avec l’option -R.

lsof -R
Comment lister les fichiers ouverts d'un processus parent et enfant (récursif)

Comment utiliser l’exclusion et négation avec lsof

Vous pouvez aussi exclure des processus, utilisateurs et autres en utilisant l’opérateur ^.
L’opérateur est à placer devant l’élément à exclure.

Par exemple pour lister les fichiers ouverts en excluant ceux de l’utilisateur root et www-data :

lsof -u ^root,^www-data
Comment utiliser l'exclusion et négation avec lsof
sudo lsof +D /home -u ^debian
Comment utiliser l'exclusion et négation avec lsof

Comment lister ou exclure les librairies de la sortie lsof (colonne FD)

L’option -d permet de cibler sur le FD (File Descriptor).
Vous pouvez donc lister que les librairies, commandes, répertoires, etc.

Par exemple pour ne lister que les librairies ouvertes soit donc du type mem :

sudo lsof -d mem
Comment lister ou exclure les librairies de la sortie lsof (colonne FD)

Pour lister les fichiers ouverts qui ne sont pas des librairies et qui n’appartiennent pas à l’utilisateur root ou www-data :

sudo lsof -u ^root,^www-data -d ^mem -a
Comment lister ou exclure les librairies de la sortie lsof (colonne FD)

Enfin on peut spécifier plusieurs FD, par exemple pour lister les commandes et texte.
Cela fait ressortir une bonne partie des commandes exécutées mais autant utiliser top dans ce cas :

sudo lsof -d txt,cwd
Comment lister ou exclure les librairies de la sortie lsof (colonne FD)

Comment lister les unix socket avec lsof

Comme les sockets utilisent des fichiers descripteurs (comme la plupart des ressources sur Linux), vous pouvez aussi utiliser la commande lsof pour lister les unix domain socket.

Pour cela, on utilise l’option +E comme ceci :

lsof +E -aU
Comment lister les Sockets Unix dans Linux avec lsof

Comment afficher le PID du processus qui ouvre un fichier ou répertoire

Pour voir les ID de processus des processus qui ont ouvert un fichier particulier, utilisez l’option -t et fournissez le nom du fichier sur la ligne de commande.
Par exemple pour obtenir le PID du processus qui ouvre le fichier /var/log/messages :

sudo lsof -t /var/log/messages

Pour lister les PID des processus qui ouvre le dossier /var/log :

sudo lsof -t +D /var/log/
Comment afficher le PID du processus qui ouvre un fichier ou répertoire

Rafraîchir automatiquement l’affichage

lsof possède aussi une option pour rafraichir automatiquement la liste des fichiers ouvert grâce à l’option -r ou +r.
Indiquez le délai de rafraichissement en seconde.

Par exemple pour lister les fichiers ouverts par le processus SSH pour l’utilisation Debian en rafraichissant la liste toutes les 5 secondes :

sudo lsof -u debian -c ssh -a -r5

Comment tuer le processus qui ouvre un fichier ou répertoire

Vous pouvez combiner la commande Kill avec lsof et son option -t pour demander à tuer les processus qui ouvre un fichier spécifique.

kill -9 `lsof -t /repertoire/fichier`