Comment utiliser lsof sous Linux (avec un exemple pratique)

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

Qu'est-ce que c'est lsof ?

Disponible nativement sur n'importe quel système d'exploitation Linux, le |__+_| La commande fournit une liste des fichiers ouverts. Cependant, la sortie peut être un peu cryptique et longue, en particulier lorsque de nombreuses applications sont utilisées sur un système donné. Jetons un coup d'œil aux bases. |__+_| production. Nous allons exécuter |_+_| en tant que racine.

Pour vous connecter en tant que root, vous pouvez ouvrir une fenêtre de terminal et taper une commande comme |__+_| ou |__+_| pour recevoir une demande d'authentification de root. Alternativement, vous pouvez exécuter |__+_|. Notez que même si vous pouvez exécuter |__+_| même en tant qu'utilisateur normal non root, vous pouvez trouver la sortie incomplète.

Exemple : Base lsof Production

|__+_|

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

Ici, nous commençons le lsof outil utilisant l'outil |__+_| commande et capturé les dix premières lignes de la sortie à l'aide d'un tube (|_+_|) pour envoyer les informations produites par |__+_| à un secondaire |_+_| commande qui ne capture que les dix premières lignes (en-tête).

Le |__+_| La commande répertorie plusieurs colonnes. Voyons d'abord le J'ENVOIE colonne qui liste le fichier binaire qui contient le fichier ouvert / le bloc fichier ouvert. Ensuite, nous voyons la colonne Process ID. PID ce qui est extrêmement utile lorsque vous essayez de déboguer divers problèmes d'application, y compris les plantages de fichiers mal conservés. Dans la section suivante, nous verrons un exemple d'utilisation de |__+_| en combinaison avec |_+_| pour terminer (de manière destructive) les applications qui contiennent des blocs de fichiers défectueux.

S'il est pris en charge par votre système d'exploitation, le MÉTÉO peut vous aider à comprendre si une ligne particulière est un processus ou une activité. Si la sortie est vide, comme on peut le voir dans notre exemple (s'exécutant sur Linux Mint, un système d'exploitation qui prend en charge le MÉTÉO sortie de colonne), la ligne/commande donnée est un processus, pas une tâche. Par exemple, si vous démarrez une application de calculatrice sur votre système d'exploitation, telle qu'une tâche, cette colonne sera remplie avec un numéro d'identification de tâche/thread.

La TASKCMD La colonne contient le nom de la commande de tâche. Encore une fois, il n'est visible que si la ligne indiquée est une activité et non un processus. C'est normalement le même que la commande / le processus montré dans le premier. J'ENVOIE , cependant, par exemple, Linux permet à une tâche de modifier le nom de la commande, afin qu'elle puisse contenir des informations supplémentaires sur la tâche. La NOM D'UTILISATEUR La colonne répertorie l'utilisateur qui a démarré le processus/l'activité.

Nous avons donc une colonne importante DF (descripteur de fichier) qui peut lister i 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 |__+_| dans cette colonne signifie répertoire de travail courant y indique que le processus ou la tâche spécifié a un verrou ouvert sur le répertoire de travail actuel et que le répertoire de travail est répertorié PRÉNOM colonne.

Pour une liste complète de tous les |__+_| possibles chaînes, comme |_+_| à l'invite de commande suivi en tapant |__+_| (avec 3 espaces après la barre oblique et avant FD) une fois dans le manuel, puis en appuyant sur SE CONNECTER pour trouver la section FD.

En ce qui concerne les fichiers normaux, vous pouvez penser à DF comme un compteur ou un compteur d'ID unique, commençant à 0 et remontant 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 réglage etc...

Lorsque vous regardez des fichiers normaux, le DF la colonne affichera par exemple |__+_| ou |__+_|. Ces deux exemples représentent respectivement le 102e fichier s'est ouvert sur le système, en mode d'accès mixte lecture/écriture, comme indiqué par |_+_| indicateur / étiquette Oui le treizième fichier ouvert dans le système, uniquement en mode d'accès en écriture .

La LE GENRE la colonne est explicite ; indique s'il faut conserver un fichier normal ou un bloc d'ouverture de répertoire. Il y a plusieurs autres balises qui peuvent apparaître ici et une recherche pour |__+_| en |__+_| (comme expliqué ci-dessus) fournira une liste complète.

La 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 |__+_| colonne est la taille du fichier, ou le décalage du fichier en octets, et la NŒUD La colonne affiche généralement le nœud de fichier ou le numéro d'inode de fichier NFS des fichiers locaux. Vous pouvez également lister, par exemple TCP O UDP lorsque le cadenas donné est une connexion Internet ouverte.

Exemple : utiliser lsof avec meurtre

Utiliser |__+_| en combinaison avec |_+_|, |__+_| ET |__+_| vous pouvez rechercher un fichier spécifique sur un système donné, puis terminer le processus (à l'aide de la PID o Identifiant de processus, décrit ci-dessus).

Notez que cela ne devrait être fait que dans les situations où cela a du sens. Par exemple, vous pouvez avoir un script Bash multi-thread qui lance de nombreux sous-shells différents où chacun contient un certain fichier et attend que l'un des threads se mette en veille. Vous connaissez le nom du fichier ouvert à partir du processus de suspension, mais vous ne savez pas quel est le nom du fichier. PID pour ce processus/activité c'est le cas.

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

|__+_|

Mettons cela dans un exemple pratique. Supposons que nous ayons créé le script suivant |__+_| dans |__+_| :

|__+_|

Ce script, lorsqu'il est exécuté, créera un répertoire appelé |__+_|, modifiera les répertoires qu'il contient avec |_+_| puis |__+_| pendant 10 heures. Bien que cela ne semble ouvrir aucun fichier à première vue, rappelez-vous que |__+_| Discuté avant; le script a un répertoire de travail en cours d'utilisation, à savoir |__+_| !

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

Exécutez un script test.sh qui gardera les répertoires ouverts comme indiqué ci-dessous par lsof

Nous passons ensuite à une nouvelle session de terminal/secondaire et exécutons |__+_|, en recherchant le répertoire de travail du script, c'est-à-dire |__+_| :

lsof avec un grep pour la correspondance de texte est un excellent moyen de rechercher la sortie détaillée de lsof

Comme nous pouvons le voir, |_+_| est capable de trouver non seulement notre script de test |__+_| qui s'accroche à |_+_| englobant |_+_|, mais nous voyons aussi que |_+_|, commencé à l'intérieur du trait d'union, contient un |_+_| ouvre le descripteur de fichier (ou plutôt de répertoire) dans le même répertoire.

On peut aussi voir les deux PID Pour le |__+_| trait d'union ainsi que pour le |__+_| J'envoie. Supposons une seconde que notre |__+_| le script a été suspendu et nous avons voulu le terminer de manière complètement destructive, par exemple avec |__+_| qui est le moyen le plus destructeur de tuer un processus sans aucun niveau d'arrêt régulier, et cela est basé sur les fichiers ouverts (ou dans notre cas, les répertoires ouverts) auxquels le script s'accroche. Nous donnons la commande suivante depuis le terminal secondaire :

|__+_|

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

Cette commande prendra la sortie ci-dessus et l'analysera plus en détail. Le |__+_| Il échantillonne essentiellement à partir de la colonne secondaire (les ID de processus) et du |__+_| la commande passera cette deuxième colonne à |__+_| (le |__+_| dans la commande sera remplacé par l'entrée |_+_| qu'il reçoit).

On pourrait bien l'anticiper |__+_| a une ligne d'en-tête contenant |__+_| et ce texte sera également tué. Bien que cela ne crée pas de problème, une meilleure commande générale lirait |__+_| ou une autre façon de filtrer entièrement la première ligne.

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

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

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

Fin

Dans cet article, nous avons exploré l'utilisation de |__+_|, la commande list open files, et les informations que chacune des colonnes représente dans sa sortie par défaut. Nous discutons également d'un cas d'utilisation pratique où nous utilisons |__+_| en combinaison avec |_+_|, |__+_| ET |__+_| pour trouver un fichier particulier (ou dans notre cas un répertoire) maintenu ouvert par un script, puis terminer ce script fermant ainsi le répertoire ouvert.

Si vous avez apprécié la lecture de cet article, consultez notre section Réclamations, erreurs et défauts : quelle est la différence ? Article.

Qu'est-ce que tu penses?