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.
Sommaire
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
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 :
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
:
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 {}
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é :
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.