lsof - restreindre la sortie aux fichiers physiques uniquement - comment?

30

Comment puis-je dire à lsof que je dois répertorier uniquement les fichiers physiques (pas les sockets, pas les connexions TCP / IP, uniquement les fichiers physiques)?

Vladislav Rastrusny
la source
Vous devez d'abord déterminer pourquoi vous en avez besoin. Dire "fichiers physiques" est trop général. lsof vous donnera les fichiers qui ont été ouverts avec un descripteur de fichier. il vous donnera des fichiers qui ont été ouverts en tant que fichiers mappés en mémoire par des threads. il vous donnera des fichiers de bibliothèque qui ont été ouverts par des processus. ce sont tous des fichiers physiques, mais la façon dont ils sont utilisés est différente.
Michael Martinez

Réponses:

37

Je viens de parcourir quelques pages de manuel, il semble que vous utilisiez la commande:

sudo lsof /

Cela listera tous les fichiers ouverts dans le répertoire /, qui est tout sur un système de fichiers Linux. Juste testé et il montre seulement REG et DIR.

Plus d'exemples:

lsof -a -d 0-999 -c <command name> /
lsof -a -d 0-999 -p <pid> /

0-999 le limite aux fichiers avec un numéro de descripteur de fichier.

Dave Drager
la source
2
Comprendra également des FIFO.
Kyle Brandt du
1
Agréable et simple. Si vous n'avez besoin que de la dernière colonne, vous pouvez ajouter | awk {'print $ 9'} Intéressant. Je n'ai pas non plus fifo dans ma sortie. Fedora 12 et CentOS 5.3
egorgry
CentOS 5.2 et Ubuntu 9.04 renvoient les fifo pour moi, cela pourrait être un changement, mais êtes-vous sûr qu'il y a des fifos? Je voudrais le chercher d'abord et m'assurer qu'il est là, puis essayer le/
Kyle Brandt
De plus, je me contentais de tergiverser, on dirait qu'il ne veut tout simplement pas le bruit, et il n'y aura probablement pas beaucoup de fifos.
Kyle Brandt du
4
lsof / inclut uniquement les fichiers du système de fichiers racine. Si plusieurs systèmes de fichiers sont montés, ils n'apparaîtront pas dans la sortie. Je trouve que la meilleure façon est d'utiliser simplement grep.
James
9

Il peut y avoir un commutateur, mais si cela ne vous dérange pas de le filtrer via grep, vous pouvez le faire sudo lsof | egrep 'REG|DIR', en supposant que par "fichiers physiques" vous voulez dire des fichiers et des répertoires normaux.

Voir la section OUTPUT :: TYPE de la page man lsofde manuel pour tous les types qui pourraient être dans cette colonne.

Kyle Brandt
la source
24
Il peut y avoir un changement, mais la page de manuel se lit comme la thèse de doctorat de quelqu'un ... :)
Cawflands
1
Oui ... lsof man est extrêmement difficile à lire ...; p)
Vladislav Rastrusny
Attribuez +1 à ce commentaire. :)
egorgry
sur un serveur vpn avec suffisamment de clients, lsof ne reviendra pas, donc greping n'est pas une option pour moi
Ohad Cohen
@OhadCohen lsof reviendra si vous limitez ce qu'il recherche. Voir "FD" dans la page de manuel (mem, cwd, pd, etc)
Michael Martinez
2

C'est ce que j'ai fait qui a parfaitement fonctionné pour moi:

lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u

L' -F noption à le lsoffera imprimer uniquement les noms des fichiers ouverts. Chaque ligne de sortie portant le nom d'un fichier ouvert commencera par le seul caractère n suivi immédiatement du nom . Les fichiers normaux seront toujours le nom absolu et complet du fichier. Le grep ^n/sélectionne uniquement les lignes dont le nom commence par a /(ce qui signifie un nom de fichier absolu et complet); éliminant ainsi des choses comme les ports ouverts, les sockets, les tuyaux (comme les FIFO), etc. Le cut -c2-éliminera le premier caractère, le n, ne laissant que le nom du fichier. Enfin, le sort -usupprime toutes les entrées en double.

Une mise en garde, cela inclura les fichiers qui ne sont pas réguliers tant que leur nom commence par a /. Par exemple, tous les fichiers commençant par ce qui suit seront inclus:

  • / dev
  • / proc
  • / sys

Et il peut y en avoir d'autres en fonction de votre système d'exploitation.

Greg Barrett
la source