Comment utiliser lsof sous Linux (avec un exemple pratique) - CloudSavvy IT
Agence web » Actualités du digital » Comment utiliser lsof sous Linux (avec un exemple pratique) –

Comment utiliser lsof sous Linux (avec un exemple pratique) –

Vous êtes-vous déjà demandé comment découvrir quels fichiers sont 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.

Quel est lsof?

Disponible nativement dans n’importe quel système d’exploitation Linux, le lsof La commande fournit une liste des 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’oeil à la base lsof production. nous allons courir lsof comme racine.

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

Exemple : de base lsof Production

sudo su
lsof | head -n10

Début de la sortie lsof et noms de colonne lsof dans un terminal Bash

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

Le lsof La commande répertorie différentes colonnes. Tout d’abord, nous voyons le COMMANDER colonne qui répertorie le binaire qui détient le verrou de fichier ouvert/fichier ouvert. Ensuite, nous voyons la colonne ID de processus PID ce 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 mettre fin (de manière destructive) aux applications qui détiennent des verrous de fichiers incorrects.

S’il est pris en charge par votre système d’exploitation, le TID peut aider à comprendre 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 TID sortie 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 remplie par un numéro d’identification de tâche/fil.

Le TÂCHECMD colonne 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 montré dans le premier COMMANDER colonne, bien que, par exemple, Linux permette à une tâche de changer son nom de commande, afin qu’elle puisse contenir des informations supplémentaires sur la tâche. Le UTILISATEUR La colonne répertorie l’utilisateur qui a démarré le processus/la tâche.

Ensuite, nous avons une colonne importante FD (Descripteur de fichier) qui peut lister 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, il signifie répertoire de travail courant et il indique que le processus ou la tâche donné détient un verrou ouvert sur le répertoire de travail actuel et que le répertoire de travail est répertorié sous le NOM colonne.

Pour une liste complète de tous les possibles FD chaînes, tapez man lsof à votre invite de commande suivie en tapant / FD (avec 3 espaces après la barre oblique et avant FD) une fois à l’intérieur du manuel, puis en appuyant sur ENTRER pour rechercher la section FD.

Lorsqu’il s’agit de fichiers normaux, vous pouvez penser à la FD colonne 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 ulimit -n réglage, etc

Lorsque vous consultez des fichiers normaux, le FD colonne affichera par exemple 102u ou alors 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 le u indicateur/étiquette et le 13e fichier ouvert sur le système, en mode d’accès en écriture uniquement.

Le TAPER colonne 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.

Le DISPOSITIF La colonne 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. Le SIZE/OFF la colonne est la taille du fichier, ou le décalage du fichier en octets, et le NŒUD La colonne affiche généralement le nœud de fichier ou le numéro d’inode du fichier NFS des fichiers locaux. Il peut aussi lister par exemple TCP ou alors UDP lorsque le verrou donné est une connexion Internet ouverte.

Exemple : Utilisation lsof avec tuer

En utilisant lsof en combinaison avec grep, awk et kill on peut rechercher un système donné pour un fichier spécifique et ensuite terminer le processus (en utilisant le PID, ou Identificateur 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 de suspension, mais vous ne savez pas ce que le PID pour ce processus/tâche est.

Dans une telle situation, nous pouvons exécuter les commandes suivantes :

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 suivant test.sh dans /tmp:

rm -Rf workspace
mkdir workspace
cd workspace
sleep 36000

Ce script, une fois exécuté, créera un répertoire nommé workspace, changez de répertoire avec cd puis sleep pendant 10 heures. Bien qu’à première vue, cela ne semble pas ouvrir de fichiers, rappelez-vous que 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émarrez le script dans une session de terminal :

Exécution d'un script test.sh qui contiendra les répertoires ouverts répertoriés ultérieurement par lsof

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

lsof avec un grep pour faire correspondre le texte est un excellent moyen de rechercher la sortie lsof verbeuse

Comme on peut le voir, lsof est capable de trouver non seulement notre script de test test.sh qui tient un cwd verrouiller /tmp/workspace, mais on voit aussi que sleep, démarré à partir du script, tient un cwd ouvrir le descripteur de fichier (ou mieux de répertoire) sur le même répertoire.

On peut aussi voir à la fois le PID pour le test.sh script ainsi que pour le sleep commander. Supposons une seconde que notre test.sh le script était suspendu et nous voulions le terminer complètement de manière destructive, c’est-à-dire avec kill -9 qui est le moyen le plus destructeur de mettre fin à un processus sans aucun niveau d’arrêt gracieux, et cela 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 "workspace" | awk '{print $2}' | xargs -I{} kill -9 {}

Tuez un processus à l'aide de kill -9 basé sur une recherche lsof à l'aide de grep

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

On pourrait aussi anticiper que lsof a une ligne d’en-tête qui contient PID et ce texte sera également transmis à kill. Bien que cela ne créera pas de problème, une meilleure commande globale aurait lu lsof | grep "workspace" | grep -v "PID" | awk '{print $2}' | xargs -I{} kill -9 {}, ou une autre façon de filtrer complètement la première ligne.

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

Le script test.sh a tué la sortie à la suite du kill exécuté dans l'autre terminal

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.

Emballer

Dans cet article, nous avons exploré l’utilisation lsof, la commande list open files et les 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.

★★★★★