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 :

$ sudo yum install lsof

pour CentOS/RHEL 8, vous pouvez utiliser la commande DNF

$ sudo dnf install lsof

Ubuntu / Debian :

$ sudo apt install lsof

Obtenir de l’aide

Vous pouvez obtenir une liste résumée des options supportées par lsof en utilisant les drapeaux - ? ou -h.

$ lsof - ?
lsof 4.87
 dernière révision : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 dernière FAQ : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 dernière page de manuel : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 utilisation : [-?abhKlnNoOPRtUvVX] [ |-c c] [ |-d s] [ D D] [ |-f[gG]] [ |-e s]
 [-F <x>[f]</x>] [-g <x>[s</x>]] [-i [i]] [ |-L <x>[l]</x>] [ m <x>[</x>m]] [ |-M] [-o [o]] [-p [s]] [-i [i]] [-p s]
[-o [o]] [-p s] [ |-r <x><x><x>[t</x></x></x>]] [-s [p:s]] [-s [p:s]] [-S [t]] [-S <x><x><x>[t</x></x></x>]] [-T <x><x><x>[t</x></x></x>]] [-u s] [ |-w] [-x <x>[fl]] [-Z [Z]] [-x [fl]] [-x [fl</x>]] [-Z [Z]] [--] [noms]
Valeurs par défaut entre parenthèses ; éléments d'un ensemble (s) séparés par des virgules ; plages séparées par des tirets.
  -?|-h liste d'aide -a sélections AND (OR) -b éviter les blocs du noyau
  -c c cmd c ^c /c/[bix] c w COMMAND width (9) d s dir s files
  -d s select by FD set D D dir D tree *SLOW?* |-e s exempt s *RISKY*
  -i select IPv<x><x>[46]</x></x> files -K list tasKs (threads) -l list UID numbers
  -n pas de noms d'hôtes -N sélection de fichiers NFS -o liste des décalages de fichiers
  -O pas de surcharge *RISKY* -P pas de noms de ports -R liste des PID de paRents
  -s liste la taille du fichier -t liste laconique -T désactivation des informations TCP/TPI
  -U sélectionne un socket Unix -v liste des informations sur la version -V recherche verbeuse
   |-w Warnings ( ) -X sauter les fichiers TCP&UDP* -Z Z contexte [Z]
  -- option de fin d'analyse
   f|-f système de fichiers ou -noms de fichiers |-f[gG] flaGs
  -F <x>[f]</x> sélectionner des champs ; -F ? pour obtenir de l'aide
   |-L <x>[l]</x> liste ( ) supprimer (-) le nombre de liens < l (0 = tous ; par défaut = 0)
                                         m <x>[m]</x> utiliser|créer un supplément de montage
   |-M enregistrement du portMap (-) -o o o 0t chiffres de décalage (8)
  -p s exclure(^)|sélectionner les PID -S <x><x><x>[t]</x></x></x> t second stat timeout (15)
  -T qs TCP/TPI Q,St (s) info
  -g <x>[s]</x> exclure(^)|sélectionner et imprimer les ID des groupes de processus
  -i i sélection par adresse IPv<x><x>[46]</x></x>: <x><x>[46]</x></x>[proto][@host|addr][:svc_list|port_list]
   |-r [t[m<fmt>]] répéter toutes les t secondes (15) ; jusqu'à ce qu'il n'y ait plus de fichiers, - pour toujours.
       Le suffixe optionnel de t est m<fmt> ; m doit séparer t de <fmt> et <fmt> est une chaîne de caractères
      <fmt> est un format strftime(3) pour la ligne de marquage.
  -s p:s exclude(^)|sélectionne les états du protocole (p = TCP|UDP) par nom(s).
  -u s exclure(^)|sélectionner login|UID set s
  -x <x>[fl]</x> cross over d| D Systèmes de fichiers ou liens symboliques
  names sélectionne des fichiers nommés ou des fichiers sur des systèmes de fichiers nommés
Tout le monde peut lister tous les fichiers ; les avertissements /dev sont désactivés ; la vérification de l'ID du noyau est désactivée.
$

Pour vérifier les informations détaillées sur la version installée, utilisez

$ lsof -v
informations sur la version de lsof :
    révision : 4.87
    dernière révision : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
    dernière FAQ : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
    dernière page de manuel : ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
    construit : Tue Oct 30 16:28:19 UTC 2018
    construit par et sur : mockbuild@x86-01.bsys.centos.org
    compilateur : cc
    version du compilateur : 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
    drapeaux du compilateur : -DLINUXV=310000 -DGLIBCV=217 -DHASIPv6 -DHASSELINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAS_STRFTIME -DLSOF_VSTR="3.10.0" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
    drapeaux de chargement : -L./lib -llsof -lselinux
    info système : Linux x86-01.bsys.centos.org 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    Tout le monde peut lister tous les fichiers.
    les avertissements /dev sont désactivés.
    La vérification de l'ID du noyau est désactivée.
$

Champs de sortie

la structure des champs de sortie du lsof est la suivante par défaut :

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME

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

cwd répertoire de travail actuel ;
Lnn références de bibliothèque (AIX) ;
err erreur d'information FD (voir la colonne NAME) ;
jld répertoire jail (FreeBSD) ;
ltx texte de la bibliothèque partagée (code et données) ;
Mxx numéro de type de mémoire mappée hexagonale xx.
m86 DOS Fusionner un fichier mappé ;
mem fichier à mémoire mappée ;
mmap memory-mapped device (périphérique à mémoire) ;
pd répertoire parent ;
rtd répertoire racine ;
tr fichier de trace du noyau (OpenBSD) ;
txt texte du programme (code et données) ;
v86 fichier mappé VP/ix ;

Le champFD est suivi d’un ou plusieurs caractères décrivant le mode d’ouverture du fichier :

r pour l'accès en lecture ;
w pour l'accès en écriture ;
u pour l'accès en lecture et en écriture ;
espace si le mode est inconnu et qu'aucun caractère de verrouillage ne suit ;
`-' si le mode est inconnu et que le caractère de verrouillage suit.

Le caractère de mode pour FD peut être suivi par le caractère LOCK dont la description est donnée ci-dessous :

N pour un verrou Solaris NFS de type inconnu ;
r pour un verrou de lecture sur une partie du fichier ;
R pour un verrou de lecture sur l'ensemble du fichier ;
w pour un verrou en écriture sur une partie du fichier ;
W pour un verrou en écriture sur l'ensemble du fichier ;
u pour un verrou de lecture et d'écriture de n'importe quelle longueur ;
U pour un verrou de type inconnu ;
x pour un verrou SCO OpenServer Xenix sur une partie du fichier ;
X pour un verrou SCO OpenServer Xenix sur l'ensemble du fichier ;
espace s'il n'y a pas de verrou.

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.

sudo lsof | less

Résultat :

COMMANDE PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1632776 308905 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 16063 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265576 186547 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 16059 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 59696 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,0 142144 15699 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,0 88720 84 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,0 43712 15703 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,0 277808 229793 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,0 91800 76005 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,0 127184 59698 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,0 61680 229827 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,0 20048 59690 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,0 155744 16048 /usr/lib64/libselinux.so.1

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 :

$ sudo lsof {nom-de-fichier}

Résultat :

$ sudo lsof /var/log/messages
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
rsyslogd 1000 root 6w REG 253,0 205 16777741 /var/log/messages
$

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.

$ sudo lsof -u {nom d'utilisateur}

Résultat :

$ sudo lsof -u abhisheknair
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
sshd 1239 abhisheknair cwd DIR 253,0 224 64 /
sshd 1239 abhisheknair rtd DIR 253,0 224 64 /
sshd 1239 abhisheknair txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 1239 abhisheknair mem REG 253,0 15488 17204727 /usr/lib64/security/pam_lastlog.so
sshd 1239 abhisheknair mem REG 253,0 15648 229829 /usr/lib64/libpam_misc.so.0.82.0
sshd 1239 abhisheknair mem REG 253,0 309248 17303270 /usr/lib64/security/pam_systemd.so
sshd 1239 abhisheknair mem REG 253,0 19616 17204728 /usr/lib64/security/pam_limits.so
sshd 1239 abhisheknair mem REG 253,0 11168 17204726 /usr/lib64/security/pam_keyinit.so
sshd 1239 abhisheknair mem REG 253,0 40800 17204735 /usr/lib64/security/pam_namespace.so

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 :

$ sudo lsof -u ^{nom d'utilisateur}

Résultat :

$ sudo lsof -u ^root
COMMANDE PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 630 dbus cwd DIR 253,0 224 64 /
dbus-daem 630 dbus rtd DIR 253,0 224 64 /
dbus-daem 630 dbus txt REG 253,0 223232 50590133 /usr/bin/dbus-daemon
dbus-daem 630 dbus mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
dbus-daem 630 dbus mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
dbus-daem 630 dbus mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
dbus-daem 630 dbus mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
dbus-daem 630 dbus mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
dbus-daem 630 dbus mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0

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) :

# kill -9 `lsof -t -u {nom d'utilisateur}`

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.

$ sudo lsof -t -u {username}

Résultat :

$ sudo lsof -t -u abhisheknair
1239
1240
$

Avec lsof, nous pouvons combiner plusieurs arguments en utilisant la logique OR comme indiqué ci-dessous :

$ sudo lsof -u {nom d'utilisateur} -c {nom du processus}

Résultat :

$ sudo lsof -u ftpuser -c bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1240 abhisheknair cwd DIR 253,0 120 510681 /home/abhisheknair
bash 1240 abhisheknair rtd DIR 253,0 224 64 /
bash 1240 abhisheknair txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1240 abhisheknair mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1240 abhisheknair mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1240 abhisheknair mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1240 abhisheknair mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1240 abhisheknair mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1240 abhisheknair mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1240 abhisheknair mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1240 abhisheknair 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 2u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 255u CHR 136,0 0t0 3 /dev/pts/0
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$

Si vous souhaitez utiliser la condition logique AND, utilisez l’option -a.

$ sudo lsof -u {nom d'utilisateur} -c {nom du processus} -a

Résultat :

$ sudo lsof -u ftpuser -c bash -a
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$

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.

$ sudo lsof -c {nom-du-processus}

Résultat :

$ sudo lsof -c ssh
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
sshd 997 root cwd DIR 253,0 224 64 /
sshd 997 root rtd DIR 253,0 224 64 /
sshd 997 root txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 997 root mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
sshd 997 root mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
sshd 997 root mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
sshd 997 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
sshd 997 root mem REG 253,0 15688 75906 /usr/lib64/libkeyutils.so.1.5
sshd 997 root mem REG 253,0 67104 186525 /usr/lib64/libkrb5support.so.0.1

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.

sudo lsof -p {process-id}

Résultat :

$ sudo lsof -p 663
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firewalld 663 root cwd DIR 253,0 224 64 /
firewalld 663 root rtd DIR 253,0 224 64 /
firewalld 663 root txt REG 253,0 7144 50491220 /usr/bin/python2.7
firewalld 663 root mem REG 253,0 298828 50617647 /usr/lib64/girepository-1.0/NM-1.0.typelib
firewalld 663 root mem REG 253,0 343452 50507562 /usr/lib64/girepository-1.0/Gio-2.0.typelib
firewalld 663 root mem REG 253,0 12352 17202092 /usr/lib64/python2.7/lib-dynload/grpmodule.so
firewalld 663 root mem REG 253,0 29184 17202105 /usr/lib64/python2.7/lib-dynload/selectmodule.so
firewalld 663 root mem REG 253,0 168312 388240 /usr/lib64/libdbus-glib-1.so.2.2.2
firewalld 663 root mem REG 253,0 11976 34028597 /usr/lib64/python2.7/site-packages/_dbus_glib_bindings.so
firewalld 663 root mem REG 253,0 185712 50507559 /usr/lib64/girepository-1.0/GLib-2.0.typelib
  • Si vous voulez lister tous les fichiers ouverts à l’exception de ceux ouverts par un processus particulier, utilisez -p suivi de ^process-id.
sudo lsof -p ^{numéro de processus}

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.

$ sudo lsof D {chemin}

Résultat :

$ sudo lsof D /var/log
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
auditd 607 root 5w REG 253,0 1065095 425227 /var/log/audit/audit.log
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
tuned 999 root 3w REG 253,0 13395 33574994 /var/log/tuned/tuned.log
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5513 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$

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.

$ sudo lsof d {chemin}

Résultat :

$ sudo lsof d /var/log
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5833 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$

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.

$ sudo lsof {arguments} -r{intervalle de temps}

Résultat :

$ sudo lsof -u ftpuser -c bash D /usr/lib -a -r3
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======

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.

sudo lsof -i

Résultat :

$ sudo lsof -i
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Pour lister toutes les connexions réseau utilisées par un process-id spécifique, vous pouvez utiliser lsof comme suit :

$ sudo lsof -i -a -p {process-id}

Résultat : $ sudo lsof -i -a -p {process-id} :

$ sudo lsof -i -a -p 997
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
$

Ou pour lister toutes les connexions réseau utilisées par un processus spécifique, nous pouvons donner le nom du processus comme suit :

$ sudo lsof -i -a -c {nom-du-processus}

Résultat :

$ sudo lsof -i -a -c ssh
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

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.

sudo lsof -i {protocole}

Résultat :

$ sudo lsof -i tcp
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

OR

Résultat :

$ sudo lsof -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
$

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 :

$ sudo lsof -i :{numéro de port}

Résultat :

$ sudo lsof -i :22
COMMANDE PID UTILISATEUR FD TYPE DISPOSITIF TAILLE/OFF NOM DU NOEUD
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

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 :

sudo lsof -i4

Résultat :

$ sudo lsof -i4
COMMANDE PID UTILISATEUR FD TYPE PÉRIPHÉRIQUE TAILLE/OFF NOM DU NOEUD
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

OU pour obtenir uniquement les détails de l’IPv6, utilisez :

$ sudo lsof -i6

Résultat : $ sudo lsof -i6

$ sudo lsof -i6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
$

Liste des fichiers ouverts sur NFS

lsof peut également lister tous les fichiers NFS actuellement ouverts par un utilisateur.

$ sudo lsof -N -u abhisheknair -a

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 :

$ sudo lsof {chemin} | grep deleted

Résultat : $ sudo lsof {chemin} | grep deleted

$ sudo lsof / | grep deleted
firewalld 654 root 8u REG 253,0 4096 16777726 /tmp/#16777726 (deleted)
tuned 968 root 8u REG 253,0 4096 16777720 /tmp/#16777720 (supprimé)
$

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.

$ man lsof