Comment utiliser lsof sous Linux (avec un exemple pratique)

Contenu

Comment utiliser lsof sur Linux avec un exemple pratique

Vous êtes-vous déjà demandé comment savoir quels fichiers sont ouverts et utilisés sur votre système aujourd'hui ?? 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 que c'est lsof?

Disponible nativement sur n'importe quel système d'exploitation Linux, les lsof La commande fournit une liste de fichiers ouverts. Malgré cela, la sortie peut être un peu cryptique et longue, surtout lorsque de nombreuses applications sont utilisées sur un système donné. Jetons un coup d'oeil aux bases lsof production. nous courrions lsof en tant que racine.

Pour se connecter en tant que root, vous pouvez ouvrir une fenêtre de terminal et taper une commande comme sudo su O su recevoir un message d'authentification racine. Alternativement, peut exécuter sudo lsof. Gardez à l’esprit que bien que vous puissiez courir lsof en tant qu’utilisateur normal non root en plus, vous constaterez peut-être que la sortie est incomplète.

Exemple: basique lsof Production

sudo su
lsof | tête -n10

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

Ici, nous commençons le lsof à l’aide de l' lsof commander, et capturé les dix premières lignes de la sortie à l’aide d’un tuyau (|) pour envoyer l’information sortie par lsof à une école secondaire head -n10 commande qui capture uniquement les dix premières lignes (Dirigé).

Les lsof La commande répertorie plusieurs colonnes. Tout d’abord, nous voyons le COMMANDER colonne qui répertorie le binaire qui contient le fichier ouvert / verrou de fichier ouvert. Ensuite, on voit la colonne d'identification de la procédure. PID ce qui est extrêmement utile lorsque vous essayez de déboguer divers problèmes d'application, y compris les verrous de fichiers mal maintenus. Dans la section suivante, nous verrons un exemple de la façon dont nous pouvons utiliser lsof en combinaison avec kill pour terminer (de manière destructive) applications qui ont de mauvais verrous de fichiers.

S'il est compatible avec votre système d'exploitation, les TEMPS La colonne peut vous aider à déterminer si une certaine ligne est une procédure ou une tâche. Si la sortie est vide, comme vous pouvez le voir dans notre exemple (fonctionnant sous Linux Mint, un système d'exploitation qui prend en charge TEMPS sortie de colonne), la ligne / la commande donnée est une procédure, pas de devoirs. Et, par exemple, démarrer une application de calculatrice sur votre système d'exploitation, Autrement dit, une tache, cette colonne sera remplie avec un numéro d'identification de tâche / salut.

Les TÂCHECMD La colonne contient le nom de la commande de tâche. De nouveau, visible uniquement si la ligne donnée est une tâche et non une procédure. C'est régulièrement le même que la commande / procédure indiquée dans le premier COMMANDER colonne, même si, par exemple, Linux permet à une tâche de changer son nom de commande, afin qu'il puisse contenir des informations supplémentaires sur la tâche. Les NOM D'UTILISATEUR La colonne liste l'utilisateur qui a démarré la procédure / tâche.

Ensuite, nous avons une colonne importante FD (Descripteur de fichier) que pouvez-vous lister 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 tu vois cwd dans cette colonne, ça veut dire répertoire de travail courant et indique que la procédure ou la tâche donnée a 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, Type man lsof à votre invite de commande suivie en tapant / FD (avec 3 espaces après la barre oblique et avant FD) une fois dans le manuel, puis en appuyant sur ENTRER DANS pour trouver la section FD.

Quand il s'agit de fichiers normaux, peut penser à la FD colonne comme compteur, ou un compteur d'identification unique, à partir de 0 et augmenter jusqu'au nombre total de fichiers ouverts réguliers sur le système, avec le nombre maximum de fichiers ouverts défini par le ulimit -n ajustement, etc.

Lorsque vous regardez des fichiers normaux, les FD la colonne, par exemple, ça montrera 102u O 13w. Ces deux exemples représentent respectivement le 102e fichier ouvert dans le système, en mode d'accès mixte en lecture / l'écriture, comme indiqué par le u indicateur / étiqueter Oui les 13 Ouvrir le fichier sur le système, uniquement en mode d'accès en écriture.

Les ÉCRIT la colonne est assez explicite; indique s'il faut conserver un fichier normal ou un verrou de répertoire ouvert. Il y a plusieurs autres balises qui pourraient être affichées ici, et une recherche de / TYPE au man lsof (comme expliqué précédemment) fournira une liste complète.

Les DISPOSITIF La colonne répertorie généralement les numéros d'appareil, séparé par des virgules, pour la plupart des types de fichiers. Les SIZE/OFF la colonne est la taille du fichier, ou l'offset 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. Vous pouvez également lister, par exemple TCP O UDP lorsque le verrou donné est une connexion Internet ouverte.

Exemple: utilisation lsof avec tuer

À l'aide de lsof en combinaison avec grep, awk Oui kill on peut rechercher un fichier spécifique sur un système donné et ensuite terminer la procédure (en utilisant le PID, ou identifiant de procédure, décrit précédemment).

Veuillez noter 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 nombreuses sous-couches différentes où chacune s'accroche à un certain fichier, et attendez-vous à ce que l'un des fils pende. Connaître le nom du fichier ouvert de la procédure de suspension, mais il ne sait pas quel est le PID pour cette procédure / les devoirs sont.

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

sudo su
lsof | grep 'some_file_descriptor' | ah '{imprimer $2}' | xargs -I{} tuer -9 {}

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

rm -Rf workspace
mkdir workspace
cd workspace
sleep 36000

Ce script, lorsqu’il est exécuté, créer un répertoire nommé workspace, changer les répertoires avec cd et par la suite sleep durant 10 Heures. Bien qu’à première vue, cela ne semble ouvrir aucun fichier, souvenez-vous de l' cwd Discuté précédemment; le script a un répertoire de travail en cours d’utilisation, a savoir /tmp/workspace!

Voyons comment cela fonctionne dans la pratique. Premier, nous définissons (en utilisant votre éditeur de texte préféré comme vi) puis démarrez le script dans une session terminale:

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

Ensuite, on passe à une session terminale secondaire / nouveau et exécuter lsof, recherche du répertoire de travail du script, a savoir workspace:

lsof avec un grep pour le texte correspondant est un excellent moyen de trouver la sortie détaillée de lsof

Comme nous pouvons le voir, lsof est capable de trouver non seulement notre script de test test.sh qui a un cwd engager /tmp/workspace, mais on voit aussi que sleep, commencé à partir du script, il a un cwd ouvrir le descripteur de fichier (ou un meilleur répertoire) dans le même répertoire.

On peut aussi voir à la fois le PID Pour lui test.sh script ainsi que pour le sleep commander. Supposons une seconde que notre test.sh le script était suspendu et nous voulions absolument le terminer de manière destructive, Autrement dit, avec kill -9 qui est le moyen le plus destructeur de mettre fin à une procédure sans aucun niveau de clôture ordonnée, et ceci est basé sur n'importe quel fichier ouvert (ou dans notre cas, répertoires ouverts) qui contenait le script. Nous émettons la commande suivante à partir du terminal secondaire:

lsof | grep "espace de travail" | ah '{imprimer $2}' | xargs -I{} tuer -9 {}

Tuer un processus en utilisant kill -9 basé sur une recherche lsof utilisant grep

Cette commande prendra la sortie précédente et l'analysera plus avant. Les awk '{print $2}' Juste échantillonner la colonne secondaire (ID de procédure) et le xargs La commande passera cette deuxième colonne à kill -9 (Les {} dans la commande, il sera remplacé par n'importe quelle entrée xargs reçoit).

On pourrait aussi anticiper que lsof a une ligne d'en-tête contenant PID et ce texte sera aussi passé pour tuer. Bien que cela ne crée pas d'obstacle, une meilleure commande générale 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 de notre première session de terminal principal est que notre script est instantanément supprimé:

Le script test.sh a supprimé la sortie à la suite de la suppression exécutée dans l'autre terminal

Pour plus d'informations sur xargs, vous pouvez lire sur l'utilisation de xargs en combinaison avec bash -c pour créer des commandes complexes. Pour la programmation multiprocessus Bash, voir Comment utiliser le traitement multithread dans les scripts bash.

Fin

Dans cet article, nous explorons l'utilisation de lsof, la commande list open files et quelles informations chacune des colonnes représente dans sa sortie par défaut. Nous analysons également un cas d'utilisation pratique dans lequel nous utilisons lsof en combinaison avec grep, awk Oui kill pour trouver un fichier particulier (ou dans notre cas un annuaire) qui est maintenu ouvert par un script et termine plus tard ce script fermant ainsi le répertoire ouvert.

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

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.