Comment utiliser lsof sous Linux (avec un exemple pratique)

0
370

Vous êtes-vous déjà demandé comment découvrir les fichiers actuellement ouverts et utilisés sur votre système ? La commande Linux lsof répertorie les fichiers ouverts et fournit de nombreuses informations supplémentaires. Apprenez à utiliser lsof avec ces exemples pratiques.

Qu'est-ce que lsof ?

Disponible nativement dans n'importe quel système d'exploitation Linux, la commande lsof fournit une liste de fichiers ouverts. Cependant, la sortie peut être un peu cryptique et longue, en particulier lors de l'utilisation de nombreuses applications sur un système donné. Jetons un coup d'œil à la sortie de base de lsof. Nous exécuterons lsof en tant que root.

Pour vous connecter en tant que root, vous pouvez ouvrir une fenêtre de terminal et taper une commande comme sudo su ou su pour recevoir une invite d'authentification root. Alternativement, vous pouvez exécuter sudo lsof. Notez que même si vous pouvez également exécuter lsof en tant qu'utilisateur non root normal, vous pouvez constater que la sortie est incomplète.

Exemple : De base lsof Sortie

sudo su lsof | head -n10

Ici, nous avons commencé le lsof à l'aide de la commande lsof et capturé les dix premières lignes de la sortie à l'aide d'un tube (|) pour envoyer les informations sorties par lsof à une commande secondaire head -n10 qui ne capture que les dix premières lignes (head) .

La commande lsof liste différentes colonnes. Tout d'abord, nous voyons la colonne COMMAND qui répertorie le binaire qui détient le verrou de fichier ouvert/fichier ouvert. Ensuite, nous voyons la colonne d'ID de processus PIDce qui est extrêmement pratique lorsqu'il s'agit de déboguer divers problèmes d'application, y compris les verrous de fichiers mal maintenus. Dans la section suivante, nous examinerons un exemple de la façon dont nous pouvons utiliser lsof en combinaison avec kill pour terminer (de manière destructive) les applications qui détiennent des verrous de fichiers incorrects.

Publicité

Si pris en charge sur votre système d'exploitation, la colonne TID peut aider à savoir si une ligne donnée est un processus ou une tâche. Si la sortie est vide, comme on peut le voir dans notre exemple (qui s'exécute sur Linux Mint, un système d'exploitation qui prend en charge le TIDsortie de la colonne), la ligne/commande donnée est un processus, une non-tâche. Si, par exemple, vous démarrez une application de calculatrice dans votre système d'exploitation, c'est-à-dire une tâche, cette colonne sera renseignée par un numéro d'identification de tâche/thread.

La colonne TASKCMD contient le nom de la commande de tâche. Encore une fois, il n'est visible que si la ligne donnée est une tâche et non un processus. C'est régulièrement le même que la commande/processus affiché dans la première COMMANDEcolonne, cependant, par exemple, Linux permet à une tâche de changer son nom de commande, afin qu'elle puisse contenir des informations supplémentaires sur la tâche. La colonne USER répertorie l'utilisateur qui a démarré le processus/la tâche.

Ensuite, nous avons une colonne importante FD (File Descriptor) qui peut répertorier les Numéro de descripteur de fichier ou une chaîne de texte spécifique indiquant de quel type de descripteur de fichier il s'agit. Par exemple, si vous voyez cwd dans cette colonne, cela signifie répertoire de travail actuelet cela indique que le processus ou la tâche donné détient un verrou ouvert sur le répertoire de travail actuel et que ce répertoire de travail est répertorié dans la colonne NAME.

Pour une liste complète de tous chaînes FD possibles, tapez man lsof à votre invite de commande, puis tapez/FD (avec 3 espaces après la barre oblique et avant FD) une fois dans le manuel, puis appuyez sur ENTER pour rechercher la section FD.< /p>

En ce qui concerne les fichiers normaux, vous pouvez penser au FDcolonne comme un compteur ou un compteur d'ID unique, commençant à 0 et augmentant jusqu'au nombre total de fichiers ouverts réguliers sur le système, le nombre maximum de fichiers ouverts étant défini par le paramètre ulimit -n , etc.

Lorsque vous regardez des fichiers normaux, la colonne FD affichera par exemple 102u ou 13w. Ces deux exemples représentent respectivement le 102e fichier ouvert sur le système, en mode d'accès mixte lecture/écriture, comme indiqué par l'indicateur/étiquette u et le 13e fichier ouvert sur le système, en écriture mode d'accès uniquement.

Publicité

Le TYPEcolonne est assez explicite; il indique si un fichier ordinaire ou un verrou ouvert de répertoire est maintenu. Il existe diverses autres étiquettes qui pourraient être affichées ici, et une recherche de/TYPE dans man lsof (comme expliqué ci-dessus) fournira une liste complète.

La colonne DEVICE répertorie généralement les numéros de périphérique, séparés par des virgules, pour la plupart des types de fichiers. La colonne SIZE/OFF est la taille du fichier, ou l'offset du fichier en octets, et le NODELa colonne affiche généralement le nœud de fichier ou le numéro d'inode du fichier NFS des fichiers locaux. Il peut également lister par exemple TCP ou UDP lorsque le verrou donné est une connexion Internet ouverte.

Exemple : Utiliser lsof avec kill

En utilisant lsof en combinaison avec grep, awk et kill, on peut rechercher un système donné pour un fichier spécifique et terminer par la suite le processus (en utilisant le PID, ou l'identifiant de processus, décrit précédemment).

Notez que cela ne doit être fait que dans les situations où cela a du sens. Par exemple, vous pouvez avoir un script Bash multithread qui démarre de nombreux sous-shells différents où chacun conserve un fichier donné, et vous vous attendez à ce que l'un des sous-processus se bloque. Vous connaissez le nom de fichier ouvert du processus suspendu mais ne savez pas quel est le PID pour ce processus/tâche.

Dans une telle situation, nous pouvons exécuter les commandes suivantes :< /p> sudo su lsof | grep 'some_file_descriptor' | awk '{print $2}' | xargs -I{} kill -9 {}

Mettons cela dans un exemple pratique. Supposons que nous ayons créé le script test.sh suivant dans /tmp :

rm -Rf workspace mkdir workspace cd workspace sleep 36000 Publicité

Ce script, une fois exécuté, créera un répertoire nommé workspace, changera de répertoire dedans avec un cd, puis dormez pendant 10 heures. Bien qu'à première vue, cela ne semble ouvrir aucun fichier, rappelez-vous le cwd discuté plus tôt ; le script a un répertoire de travail en cours d'utilisation, à savoir /tmp/workspace !

Voyons comment cela fonctionne concrètement. Tout d'abord, nous définissons (en utilisant votre éditeur de texte préféré comme vi), puis démarrons le script dans une session de terminal :

< /p>

Ensuite, nous sautons dans une session de terminal secondaire/nouvelle et exécutons lsof, en recherchant le répertoire de travail du script, à savoir l'espace de travail :

Comme nous pouvons le voir, lsof est capable de trouver non seulement notre script de test test.sh qui détient un verrou cwd sur /tmp/workspace, mais nous voyons également que sleep, démarré à partir du script, contient un fichier cwd ouvert ( ou un meilleur descripteur de répertoire) sur le même répertoire.

Nous pouvons également voir à la fois le PIDpour le script test.sh ainsi que pour la commande sleep. Supposons une seconde que notre script test.sh était suspendu et que nous voulions le terminer complètement de manière destructive, c'est-à-dire avec kill -9 qui est le moyen le plus destructeur de terminer un processus sans aucun niveau d'arrêt gracieux, et ceci en fonction des fichiers ouverts (ou dans notre cas des répertoires ouverts) que le script tenait. Nous lançons la commande suivante depuis le terminal secondaire :

lsof | grep “espace de travail” | awk '{print $2}' | xargs -I{} kill -9 {}

Cette commande prendra la sortie précédente et l'analysera davantage. L'awk '{print $2}' échantillonne essentiellement la colonne secondaire (l'ID de processus) et la commande xargs passera cette deuxième colonne à kill -9 (le {} dans la commande sera remplacé par n'importe quelle entrée xargs reçoit).

Publicité

Nous pourrions également prévoir que lsof a une ligne d'en-tête qui contient le PID et que ce texte sera également passé à kill. Bien que cela ne créera pas de problème, une meilleure commande globale aurait lu lsof | grep “espace de travail” | grep -v “PID” | awk '{print $2}' | xargs -I{} kill -9 {}, ou un autre moyen de filtrer complètement la première ligne.

Le résultat de notre première/primaire session de terminal est que notre script est instantanément tué :

< p>Si vous souhaitez en savoir plus sur xargs, vous pouvez en savoir plus sur l'utilisation de xargs en combinaison avec bash -c pour créer des commandes complexes. Pour la programmation multithread Bash, consultez Comment utiliser le traitement multithread dans les scripts Bash.

Résumé

Dans cet article nous avons exploré à l'aide de lsof, de la commande list open files et des informations que chacune des colonnes de sa sortie par défaut représente. Nous avons également examiné un cas d'utilisation pratique où nous avons utilisé lsof en combinaison avec grep, awk et kill pour trouver un fichier particulier (ou dans notre cas un répertoire) maintenu ouvert par un script et ensuite terminer ce script fermant ainsi le répertoire ouvert.

Si vous avez aimé lire cet article, jetez un œil à nos assertions, erreurs et plantages : quelle est la différence ? article.