lsof est un puissant utilitaire disponible pour les systèmes Linux et Unix, qui signifie littéralement “liste (des) fichiers ouverts”.
Sa principale fonction est de récupérer des informations sur les différents types de fichiers ouverts par les processus en cours d’exécution. Ces fichiers peuvent être des fichiers ordinaires, des répertoires, des fichiers en bloc, des sockets réseau, des tuyaux nommés, etc.
Avec lsof
, vous pouvez trouver différents processus verrouillant un fichier ou un répertoire, un processus écoutant sur un port, la liste des processus d’un utilisateur, les fichiers qu’un processus verrouille. Dans cet article, nous allons d’abord couvrir l’installation de lsof, puis quelques exemples d’utilisation courante.
Installation de lsof
lsof
n’est pas disponible par défaut sur la plupart des distributions Linux mais peut être facilement installé. Utilisez la commande ci-dessous pour installer lsof :
CentOS / RHEL / Fedora :
pour CentOS/RHEL 8, vous pouvez utiliser la commande DNF
Ubuntu / Debian :
Obtenir de l’aide
Vous pouvez obtenir une liste résumée des options supportées par lsof en utilisant les drapeaux - ?
ou -h
.
Pour vérifier les informations détaillées sur la version installée, utilisez
Champs de sortie
la structure des champs de sortie du lsof est la suivante par défaut :
La plupart de ces champs sont explicites, à l’exception des champs FD
et TYPE
qui sont quelque peu uniques à lsof et qui seront explorés brièvement.
FD
fait référence au numéro de descripteur de fichier du fichier et TYPE
fait référence au type de nœud associé au fichier. Nous allons maintenant passer en revue les valeurs prises en charge pour ces deux champs.
Le champFD
peut contenir les valeurs suivantes
Le champFD
est suivi d’un ou plusieurs caractères décrivant le mode d’ouverture du fichier :
Le caractère de mode pour FD
peut être suivi par le caractère LOCK
dont la description est donnée ci-dessous :
De même, le champ TYPE
peut contenir GDIR, GREG, VDIR, VREG, IPV4, IPV6
, etc. Pour obtenir une liste complète des TYPE
supportés par lsof, reportez-vous à sa page de manuel
.
Utilisation courante
Vous trouverez ci-dessous quelques-unes des utilisations courantes de la commande lsof. La commande fonctionne sous toutes les variantes de Linux et tous les arguments de la ligne de commande énumérés dans les exemples ci-dessous devraient fonctionner sous toutes les plateformes, avec la même version de lsof
.
Lister tous les fichiers ouverts
Si vous exécutez la commande lsof sans aucune option, vous obtiendrez la liste de tous les fichiers actuellement ouverts par des processus actifs.
Résultat :
Liste par nom de fichier
Pour lister tous les processus qui ont ouvert un fichier spécifique, nous pouvons spécifier le nom du fichier
comme argument :
Résultat :
Liste des fichiers ouverts par nom d’utilisateur
Dans un système multi-utilisateurs, vous pouvez filtrer la liste des fichiers par processus spécifiques appartenant à l’utilisateur, en utilisant le drapeau -u
suivi du nom d'utilisateur
.
Résultat :
Alternativement, si vous voulez lister les fichiers qui sont ouverts par n’importe quel utilisateur à l’exception d’un utilisateur spécifique, utilisez le drapeau -u
suivi de ^nom d'utilisateur
comme indiqué ci-dessous :
Résultat :
L’une des façons d’utiliser lsof est dans les situations où vous souhaitez tuer rapidement tous les processus d’un utilisateur spécifique en une seule commande. Nous pouvons combiner kill
avec lsof
comme indiqué dans l’exemple ci-dessous pour réaliser ceci (exécuter en tant que root) :
Comme le montre l’exemple ci-dessus, nous pouvons utiliser le drapeau -t
pour filtrer toutes les autres informations à l’exception de l’identifiant du processus
. Cela peut être utile dans l’automatisation et l’écriture de scripts, comme le montre l’exemple précédent en le combinant avec la commande kill
.
Résultat :
Avec lsof, nous pouvons combiner plusieurs arguments en utilisant la logique OR
comme indiqué ci-dessous :
Résultat :
Si vous souhaitez utiliser la condition logique AND
, utilisez l’option -a
.
Résultat :
Liste des fichiers ouverts par processus
Nous pouvons également lister les fichiers ouverts par un processus particulier en utilisant l’option -c
suivie du nom du processus.
Résultat :
Liste des fichiers ouverts par PID
Alternativement, pour lister les fichiers ouverts par un processus mais au lieu du nom du processus
vous voulez spécifier son ID, vous pouvez utiliser le drapeau -p
suivi de l’ID du processus
.
Résultat :
- Si vous voulez lister tous les fichiers ouverts à l’exception de ceux ouverts par un processus particulier, utilisez
-p
suivi de^process-id
.
Liste des fichiers ouverts dans le répertoire
Pour lister les processus qui ont ouvert des fichiers dans un répertoire spécifique, utilisez l’option D
suivie du chemin d’accès au répertoire.
Résultat :
Si vous ne souhaitez pas lister de manière récursive les fichiers se trouvant dans des sous-répertoires, utilisez le drapeau -d
suivi du chemin d’accès au répertoire.
Résultat :
Mode de répétition
lsof peut être exécuté en mode répétitif. En mode répétition, lsof génère et imprime des sorties à intervalles réguliers. Là encore, il existe deux modes de répétition supportés par lsof, à savoir avec les drapeaux -r
et r
. Avec l’indicateur -r
, le lsof répète son exécution jusqu’à ce qu’il reçoive un signal d’interruption/d’arrêt de l’utilisateur, tandis qu’avec l’indicateur r
, le mode de répétition du lsof se termine dès qu’il n’y a plus de fichiers ouverts à la sortie. En outre, vous pouvez spécifier un délai avec les drapeaux -r
ou r
.
Résultat :
Liste des fichiers ouverts avec le protocole réseau
lsof prend en charge la liste de tous les types de fichiers Linux, y compris les sockets réseau, etc. Ainsi, nous pouvons lister les détails des connexions réseau ouvertes en utilisant le drapeau -i
.
Résultat :
Pour lister toutes les connexions réseau utilisées par un process-id
spécifique, vous pouvez utiliser lsof comme suit :
Résultat : $ sudo lsof -i -a -p {process-id} :
Ou pour lister toutes les connexions réseau utilisées par un processus spécifique, nous pouvons donner le nom du processus
comme suit :
Résultat :
Nous pouvons filtrer la sortie de lsof avec le drapeau -i
par type de protocole réseau, c’est-à-dire TCP
ou UDP
, en spécifiant le type de protocole.
Résultat :
OR
Résultat :
Liste des fichiers ouverts par port
Nous pouvons également filtrer la sortie de lsof avec le drapeau -i
par numéro de port
en utilisant la syntaxe de commande suivante :
Résultat :
Liste des fichiers ouverts par IPv4/IPv6
Il existe une option pour filtrer la liste des connexions réseau en la limitant à IPv4 ou IPv6. Utilisez la syntaxe de commande suivante pour obtenir uniquement la liste des IP v4 :
Résultat :
OU pour obtenir uniquement les détails de l’IPv6, utilisez :
Résultat : $ sudo lsof -i6
Liste des fichiers ouverts sur NFS
lsof peut également lister tous les fichiers NFS actuellement ouverts par un utilisateur.
Liste des fichiers supprimés verrouillés
Il arrive parfois que des fichiers soient supprimés sous Linux, mais qu’ils restent verrouillés par un ou plusieurs processus. Ainsi, ces fichiers n’apparaissent pas dans la liste normale du système de fichiers à l’aide de la commande ls
, etc., mais ils continuent de consommer de l’espace disque, comme l’indique la sortie df
. Cela se produit en particulier pour les gros fichiers supprimés à dessein pour libérer de l’espace disque sans libérer le verrou du processus. Vous pouvez trouver ces processus en utilisant lsof comme suit :
Résultat : $ sudo lsof {chemin} | grep deleted
Conclusion
lsof offre une série d’options permettant de personnaliser sa sortie en fonction de vos besoins. C’est un utilitaire utile pour les tâches quotidiennes d’administration du système et du réseau. La possibilité de combiner différents arguments le rend d’autant plus utile et vous permet d’obtenir facilement la sortie souhaitée. Consultez la page de manuel de lsof pour connaître tous les arguments supportés et leur utilisation.