Je suppose qu'à un moment donné, vous vous êtes demandé s'il existait un moyen d'afficher les fichiers ouverts par un processus ou un utilisateur. La bonne chose est que la réponse à cette question est la commande lsof.
Vous savez probablement déjà que la commande ls est l'abréviation de 'list'. lsof signifie "Liste des fichiers ouverts". Et c'est exactement ce qu'il fait, répertoriant les fichiers ouverts par processus, utilisateurs et ID de processus.
Laissez-moi vous montrer quelques-unes des utilisations les plus courantes de la commande lsof.
exemples de commandes lsof
Si vous utilisez la commande lsof sans options ni arguments, elle listera tous les fichiers ouverts par tous les processus du système.
lsof
Le résultat devrait ressembler à ceci :
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
La sortie est généralement explicite, mais vous pouvez toujours vous poser des questions sur les colonnes FD et TYPE.
FD signifie descripteur de fichier. Certaines des valeurs courantes pour FD sont :
- cwd – Répertoire de travail actuel
- txt – Fichiers texte
- mem - Fichier mappé en mémoire
- mmap – Périphérique mappé en mémoire
- NUMBER – Le descripteur de fichier réel. Il contient également des informations sur l'autorisation de fichier dans laquelle il est ouvert.
TYPE est une évidence. Il spécifie le type de fichier. Voici quelques exemples :
- REG – Fichier standard
- DIR – Répertoire
- CHR - Fichier spécial caractère
- FIFO – Premier entré, premier sorti
Fais-moi confiance. Vous ne voudriez pas exécuter la commande lsof sans aucun argument.
Pourquoi est-ce que je dis ça ? Parce qu'il commencera à inonder votre écran de milliers de résultats.
Si j'exécute la commande lsof sur un serveur Ubuntu et que je compte le nombre de lignes avec la commande wc, voici le résultat.
lsof | wc -l
11432
Oui! C'est exact. Il y a plus de onze mille fichiers ouverts par divers processus dans le système.
Ne vous inquiétez pas. La commande lsof est très utile pour le débogage car vous pouvez voir quels processus ouvrent quels fichiers et quel fichier est ouvert par quel processus.
Si vous n'êtes pas connecté en tant que root, la sortie de la commande lsof serait très limitée. C'est une bonne idée d'utiliser sudo si vous êtes connecté en tant qu'utilisateur non root.
1. Lister tous les process qui ont ouvert un fichier
C'est simple. Il vous suffit de spécifier le chemin d'accès au fichier.
lsof <path_to_file>
2. Lister tous les fichiers ouverts par l'utilisateur
Cela est pratique dans un environnement multi-utilisateurs. Vous pouvez lister tous les fichiers ouverts par un certain utilisateur de la manière suivante :
lsof -u <user_name>
Vous pouvez également spécifier plusieurs utilisateurs comme ceci :
lsof -u user1, user2
ou comme ceci :
lsof -u user1 -u user2
3. Lister tous les fichiers ouverts dans un répertoire
Si vous vous demandez quels fichiers ont été ouverts dans un certain répertoire, vous pouvez utiliser la commande lsof avec l'option +D.
lsof +D <path_to_directory>
La recherche est récursive. Ainsi, il listera tous les fichiers ouverts dans le répertoire mentionné et tous ses sous-répertoires.
4. Lister tous les fichiers ouverts par un processus
Vous devez connaître l'identifiant du processus (pid) dans ce cas. Si vous connaissez l'identifiant du processus, vous pouvez utiliser l'option -p de la commande lsof pour rechercher les fichiers ouverts par celui-ci.
lsof -p <pid>
Vous pouvez également spécifier plusieurs identifiants de processus.
lsof -p pid1, pid2, pid3
5. Lister tous les fichiers ouverts par une commande
Ceci est particulièrement utile pour le débogage. Supposons que vous souhaitiez voir quels fichiers sont utilisés par le démon http, il vous suffit de spécifier le nom de la commande (httpd dans notre exemple).
lsof -c <command>
6. Rechercher ouvert par un utilisateur et une commande ou un processus
Vous pouvez combiner des options telles que user et command et un processus à l'aide de l'option –a. Considérez-le comme l'opérateur ET. Cela vous donne un filtre supplémentaire tout en essayant d'affiner votre recherche.
lsof -a -u user_name -c command_name
7. Lister les connexions réseau et les ports avec la commande lsof
Vous pouvez également utiliser la commande lsof pour trouver des ports ouverts ou pour trouver quel processus utilise un port.
Vous pouvez classer tous les types de ports ouverts avec l'option -i :
lsof -i
La sortie peut ressembler à ceci :
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
Vous pouvez également spécifier le type de connexion réseau. Par exemple, pour lister tous les ports TCP ouverts, vous pouvez utiliser :
lsof -i tcp
Pour trouver quel processus utilise un port spécifique, vous pouvez fournir le numéro de port :
lsof -i :<port_number>
Astuce bonus :Utiliser l'opérateur de négation avec lsof
Vous pouvez utiliser l'opérateur de négation pour exclure un utilisateur ou un processus lors de l'utilisation de la commande lsof.
Par exemple, vous souhaitez lister tous les fichiers ouverts par un utilisateur autre que root, utilisez-le de cette manière :
lsof -u ^root
La commande lsof devient encore plus utile lorsque vous l'utilisez avec la commande grep.
J'espère que vous avez appris quelque chose de nouveau avec cet article. Si vous avez des questions ou des suggestions, veuillez laisser un commentaire ci-dessous.