Sous Linux, de nombreux objets sont considérés comme un fichier, que l'objet soit réellement un fichier, un périphérique, un répertoire ou un socket. Lister un fichier est facile, il y a le shell intégré ls
pour ça. Mais que se passe-t-il si un utilisateur souhaite voir quels fichiers sont actuellement ouverts par le processus du serveur Web? Ou si cet utilisateur voulait savoir quels fichiers sont ouverts dans un certain répertoire? C'est là lsof
qu'entre en jeu. Imaginez lsof
comme un ls
avec l'ajout de "fichiers ouverts".
Veuillez noter que bien que les BSD aient un utilitaire différent pour ce travail fstat
, plusieurs autres versions d'Unix (Solaris, par exemple) possèdent également lsof
. Les options et les indicateurs sont différents sur les autres plates-formes, ainsi que l'apparence de la sortie, mais généralement les connaissances de cet article devraient également leur être applicables.
Tout d'abord, examinons le format de la lsof
sortie et comment elle doit être lue. La sortie habituelle de lsof
sans aucun paramètre ressemblerait à ce qui suit. Cela a été coupé pour plus de lisibilité.
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 254,1 4096 2 /
init 1 root rtd DIR 254,1 4096 2 /
init 1 root txt REG 254,1 36992 7077928 /sbin/init
init 1 root mem REG 254,1 14768 7340043 /lib/x86_64-linux-gnu/libdl-2.13.so
init 1 root mem REG 254,1 1603600 7340040 /lib/x86_64-linux-gnu/libc-2.13.so
init 1 root mem REG 254,1 126232 7340078 /lib/x86_64-linux-gnu/libselinux.so.1
init 1 root mem REG 254,1 261184 7340083 /lib/x86_64-linux-gnu/libsepol.so.1
init 1 root mem REG 254,1 136936 7340037 /lib/x86_64-linux-gnu/ld-2.13.so
init 1 root 10u FIFO 0,14 0t0 4781 /run/initctl
Ces colonnes signifient ce qui suit:
- COMMAND - Processus auquel appartient un fichier ouvert, dans cet exemple, tout est lié
init
.
- PID - Le numéro d'identification du processus dudit processus.
- USER - L'utilisateur sous lequel le processus s'exécute. Car
init
c'est presque toujours root
.
- FD - Le descripteur de fichier du fichier, le plus courant étant:
cwd
- Le répertoire de travail actuel (vous remarquerez peut-être la similitude avec la pwd
commande qui imprime le répertoire de travail actuel).
rtd
- Le répertoire racine d'un processus.
txt
- A text file
, cela peut être soit un fichier de configuration lié au processus, soit le «code source» lié (ou appartenant) au processus.
mem
- Un soi-disant "fichier mappé en mémoire", c'est-à-dire un segment de mémoire virtuelle (lire: RAM) qui a été affecté à un fichier.
- Un nombre - le nombre représente le descripteur de fichier réel, le caractère après le nombre est le mode dans lequel le fichier est ouvert:
r
- Lis.
w
- Écrire.
u
- Lire et écrire.
- TYPE - Spécifie le type réel du fichier, les plus courants sont:
REG
- Un fichier régulier.
DIR
- Un annuaire.
FIFO
- Premier entré, premier sorti.
- DEVICE - Le numéro majeur et mineur du périphérique qui contient le fichier.
- SIZE - La taille du fichier, en octets.
- NODE - Le numéro d'inode du fichier.
- NAME - Le nom du fichier.
Cela peut être un peu écrasant pour le moment, mais si vous travaillez lsof
plusieurs fois, cela s'enfoncera rapidement dans votre cerveau.
Comme mentionné ci-dessus, la sortie de lsof
a été raccourcie ici. Sans aucun argument ni filtre, lsof
produit des centaines de lignes de sortie qui ne vous laisseront que confus.
Il existe deux approches de base pour résoudre ce problème:
- Utilisez une ou plusieurs des
lsof
options de ligne de commande pour affiner les résultats.
- Par exemple, canalisez la sortie
grep
.
Bien que cette dernière option puisse sembler plus confortable car vous n'aurez pas à mémoriser les lsof
options de ligne de commande, elle n'est généralement pas aussi flexible et efficace, nous allons donc nous en tenir à la première.
Imaginons que vous souhaitiez ouvrir un fichier avec votre éditeur de texte préféré, et que l'éditeur de texte vous indique qu'il ne peut être ouvert qu'en mode lecture seule car un autre programme y accède déjà. lsof
vous aidera à découvrir qui est l'agresseur:
lsof /path/to/your/file
Cela produira une sortie similaire à ceci:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2679 root 5w REG 254,1 121525 6035622 /root/lsof.txt
Apparemment, vous avez oublié de fermer une session plus ancienne! Un problème très similaire se produit lorsque vous essayez de démonter un partage NFS et umount
vous indique qu'il ne peut pas car quelque chose accède toujours au dossier monté. Encore une fois, lsof
peut vous aider à identifier le coupable:
lsof +D /path/to/your/directory/
Remarquez la barre oblique de fin, c'est important. Sinon lsof
, vous supposerez que vous voulez dire un fichier normal. Ne soyez pas dérouté par l' +
avant du drapeau - lsof
a tellement d'options de ligne de commande dont il a besoin +
en plus des plus courantes -
. La sortie ressemblerait à ceci:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mocp 5637 music 4r REG 0,19 10147719 102367344 /home/Music/RMS_GNU_SONG.ogg
Cela signifie que le processus mocp
, avec le PID 5637
, appartenant à l'utilisateur music
a ouvert un fichier appelé RMS_GNU_SONG.ogg
. Cependant, même après la fermeture de ce processus, il y a toujours un problème - le volume NFS ne peut pas être démonté.
lsof
a un -c
indicateur qui affiche les fichiers ouverts avec un nom de processus arbitraire.
lsof -c mocp
Cela produirait une sortie ressemblant à ceci:
mocp 9383 music 4r REG 0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg
Dans cet exemple, il existe une autre instance d' mocp
exécution qui vous empêche de démonter le partage. Après avoir arrêté ce processus, vous voulez vous assurer que l'utilisateur music
n'a aucun autre fichier potentiellement problématique ouvert. lsof
a un -u
indicateur pour afficher les fichiers ouverts par un utilisateur spécifique. N'oubliez pas qu'un fichier n'est pas toujours un fichier ordinaire sur votre disque dur!
lsof -u music
Vous pouvez également transmettre plusieurs utilisateurs, séparés par des virgules:
lsof -u music,moremusic
Une importante note sur le comportement par défaut lsof
: les résultats sont OR à base, ce qui signifie que vous verrez les résultats de fichiers ouverts par des processus qui sont détenus soit par l'utilisateur music
ou l'utilisateur moremusic
. Si vous souhaitez voir les résultats correspondant aux processus appartenant aux deux utilisateurs, vous devez passer le drapeau -a
:
lsof -au music, moremusic
Étant donné que les deux utilisateurs sont dans le groupe musicusers
, vous pouvez également répertorier les fichiers en fonction du groupe:
lsof -g musicusers
Vous pouvez également combiner des indicateurs de ligne de commande:
lsof -u music,moremusic -c mocp
or
lsof -u ^music +D /home/Music
Dans la dernière ligne, nous avons ajouté un autre drapeau spécial - ^
, qui représente un NON logique . Si la sortie est vide après avoir exécuté cette commande, le démontage réussira probablement.
Dans les exemples précédents, nous avons surtout regardé les fichiers réguliers. Qu'en est-il des sockets et des connexions réseau?
Pour répertorier toutes les connexions réseau actuelles, lsof
le -i
drapeau:
lsof -i
La sortie ressemble à ce que nous avons vu jusqu'à présent ...
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
owncloud 3509 myuser 25u IPv4 44946 0t0 TCP strix.local:34217->myserver.vultr.com:https (ESTABLISHED)
firefox 3612 myuser 82u IPv4 49663 0t0 TCP strix.local:43897->we-in-f100.1e100.net:https (ESTABLISHED)
ssh 3784 myuser 3u IPv4 10437 0t0 TCP strix.local:51416->someserver.in:ssh (ESTABLISHED)
wget 4140 myuser 3w IPv4 45586 0t0 TCP strix.local:54460->media.ccc.de:http (CLOSE_WAIT)
... sauf une différence: au lieu des noms de fichiers ou des répertoires, la colonne NAME
affiche désormais les informations de connexion. Chaque connexion se compose des parties suivantes:
- Protocole.
- Nom d'hôte local.
- Port source de la connexion.
- Nom DNS de destination.
- Le port de destination.
- Statut de la connexion.
Comme avec de nombreux autres outils, vous pouvez désactiver la résolution des noms et ports DNS ( -n
et -P
, respectivement). Le drapeau -i
prend des paramètres supplémentaires. Vous pouvez spécifier d'afficher ou non tcp
, udp
ou des icmp
connexions ou certains ports:
lsof -i :25
or
lsof -i :smtp
Encore une fois, les paramètres peuvent être combinés. L'exemple suivant ...
lsof -i tcp:80
... ne vous montrera que les connexions TCP utilisant le port 80. Vous pouvez également le combiner avec les options que vous connaissez déjà dans les fichiers "classiques":
lsof -a -u httpd -i tcp
Cela vous montrera toutes les connexions TCP ouvertes par l'utilisateur httpd
. Notez l' -a
indicateur, qui modifie le comportement par défaut de lsof
(comme mentionné précédemment). Comme avec la plupart des outils de ligne de commande, vous pouvez aller très loin. Ce qui suit ne vous montrera que les connexions TCP dont l'état est "ÉTABLI":
lsof -i -s TCP:ESTABLISHED
À ce stade, vous devez avoir une compréhension de base du lsof
fonctionnement, ainsi que des cas d'utilisation courants. Pour plus d'informations, consultez la page de manuel de lsof
sur votre système.