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
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:
Ensuite, on passe à une session terminale secondaire / nouveau et exécuter lsof
, recherche du répertoire de travail du script, a savoir workspace
:
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 {}
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é:
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.