Commandes de base

lsof : Lister les fichiers ou sockets ouverts

Table des matières

Introduction



La commande lsof (pour List Open Files) est une commande Linux utilisée pour afficher les fichiers et les sockets ouverts par les processus en cours d'exécution sur le système. On aura donc des informations détaillées sur ces fichiers, répertoires, périphériques et connexions réseau actuellement utilisés.

lsof est fourni par le paquet du même nom.

La syntaxe de la commande est la suivante :

Code :
lsof [options] noms


Utilisation par l'exemple



Nous allons voir l'utilisation par des exemples, ça sera plus parlant.

Il est possible d'invoquer la commande sans options (si vous ne lancez pas en root, vous aurez probablement des "permission denied"), mais beaucoup d'infos d'affichent :

Code BASH :
lsof


Plusieurs colonnes s'affichent :
COMMAND: Le nom de la commande (ou du processus) associée au fichier ouvert.
PID: L'identifiant du processus associé au fichier ouvert.
TID: L'identifiant du thread associé au fichier ouvert (pour les processus multithread).
TASKCMD: Le nom de la commande du thread associé au fichier ouvert.
USER: Le nom de l'utilisateur propriétaire du fichier ouvert.
FD: Le descripteur de fichier. Il s'agit de "cwd" pour Current Working Directory", "rtd" pour Root Directory, "mem" pour un fichier mappé en mémoire, "DEL" pour un fichier supprimé, "txt" pour un fichier OU NOMBRE suivi d'une lettre indiquant si le fichier est ouvert en lecture (r), écriture(w) ou les deux (u).
TYPE: Le type de fichier ouvert, par exemple "REG" pour un fichier régulier, "DIR" pour un répertoire, "CHR" pour un fichier de caractères, etc.
DEVICE: Le nom du périphérique sur lequel se trouve le fichier ouvert.
SIZE/OFF: La taille ou le décalage du fichier.
NODE: Le numéro d'inode du fichier (qu'on retrouve avec ls -i)
NAME: Le chemin absolu du fichier ouvert.

Avec des options, on va pouvoir filtrer notre recherche.

On va pouvoir donner un nom de fichier à lsof pour voir les processus qui accèdent au fichier :

Code BASH :
lsof /home/adrien/radio/play-radio-FM.sh


Voici le résultat :
Code :
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
play-radi 5037 adrien  255r   REG  253,5     9349 11541154 /home/adrien/radio/play-radio-FM.sh


Si le fichier n'est pas utilisé, aucune information s'affiche (le code retour est 1).


Pour afficher les fichiers ouverts par un processus spécifique on utilisera l'option -p ainsi que son PID (Exemple avec le PID 5037) :

Code BASH :
lsof -p 5037


Code TEXT :
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
play-radi 5037 adrien  cwd    DIR  253,5     4096 11534337 /home/adrien
play-radi 5037 adrien  rtd    DIR  253,0     4096        2 /
play-radi 5037 adrien  txt    REG  253,0   865016   656211 /bin/bash
play-radi 5037 adrien  mem    REG  253,0   167579   922285 /usr/share/locale/fr/LC_MESSAGES/bash.mo
play-radi 5037 adrien  DEL    REG  253,0            789964 /usr/lib64/gconv/gconv-modules.cache
play-radi 5037 adrien  DEL    REG  253,0            825040 /usr/lib/locale/locale-archive
play-radi 5037 adrien  mem    REG  253,0   258824   524311 /lib64/libtinfow.so.6.3
play-radi 5037 adrien  DEL    REG  253,0            524363 /lib64/libc.so.6
play-radi 5037 adrien  mem    REG  253,0   254696   524329 /lib64/libtinfo.so.6.3
play-radi 5037 adrien  mem    REG  253,0   350280   524426 /lib64/libreadline.so.8.1
play-radi 5037 adrien  DEL    REG  253,0            524377 /lib64/ld-linux-x86-64.so.2
play-radi 5037 adrien    0u   CHR  136,2      0t0        5 /dev/pts/2
play-radi 5037 adrien    1u   CHR  136,2      0t0        5 /dev/pts/2
play-radi 5037 adrien    2u   CHR  136,2      0t0        5 /dev/pts/2
play-radi 5037 adrien  255r   REG  253,5     9349 11541154 /home/adrien/radio/play-radio-FM.sh


Pour afficher tous les fichiers ouverts par un utilisateur spécifique, on utilisera l'option -u (Exemple avec l'utilisateur adrien) :

Code BASH :
lsof -u adrien


La sortie est similaire à ce que nous avons vu au dessus.

On va pouvoir utiliser l'option -a pour effectuer une opération logique "ET" entre les options. Pour filtrer les fichiers ouverts par l'utilisateur adrien ET qui ont un descripteur numérique entre 0 et 999 (donc un fichier présent sur le disque), on utilisera ceci :

Code BASH :
lsof -a -u adrien -d 0-999



On va pouvoir utiliser l'option +D pour lister les processus ayant des fichiers ouverts dans un répertoire précis (exemple avec le dossier /var/log/mysql) :

Code BASH :
lsof +D /var/log/mysql/


Code TEXT :
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
mysqld  4993 mysql    1w   REG  253,3  1116388 1048580 /var/log/mysql/mysqld.err
mysqld  4993 mysql    2w   REG  253,3  1116388 1048580 /var/log/mysql/mysqld.err
mysqld  4993 mysql   29w   REG  253,3   482401 1048584 /var/log/mysql/mysql-slow.log


Ce cas peut être pratique si vous ne pouvez pas démonter un volume car il est en cours d'utilisation.


lsof permet également d'afficher les fichiers et sockets réseaux ouverts (LISTENING et ESTABLISHED) :

Code BASH :
lsof -i


On pourra compléter derrière l'option -i par un port spécifique (exemple sur le port 3306) :

Code BASH :
lsof -i :3306


Code TEXT :
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  4993 mysql   88u  IPv4  13754      0t0  TCP localhost:mysql (LISTEN)


Ou par un protocole :

Code BASH :
lsof -i udp


Et voilà, pour quelques options utiles à lsof.
Bien sûr, il en existe plein d'autres, détaillées dans les pages de manuels de la commande lsof.
Cette page a été vue 2113 fois