lsof : Lister les fichiers ou sockets ouverts
Table des matières
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 :
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 :
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, écriture ou exécution.
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 :
Voici le résultat :
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) :
Pour afficher tous les fichiers ouverts par un utilisateur spécifique, on utilisera l'option -u (Exemple avec l'utilisateur 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 :
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) :
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) :
On pourra compléter derrière l'option -i par un port spécifique (exemple sur le port 3306) :
Ou par un protocole :
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.
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, écriture ou exécution.
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.