Comment `lsof` garde-t-il trace des noms de file des descripteurs de files ouverts?

J'ai remarqué, si un file est renommé, lsof affiche le nouveau nom.

Pour le tester, python un script python :

 #!/bin/python import time f = open('foo.txt', 'w') while True: time.sleep(1) 

Vu que lsof suit le changement de nom:

 $ python test_lsof.py & [1] 19698 $ lsof | grep foo | awk '{ print $2,$9 }' 19698 /home/bfernandez/foo.txt $ mv foo{,1}.txt $ lsof | grep foo | awk '{ print $2,$9 }' 19698 /home/bfernandez/foo1.txt 

Figuré cela peut être via le numéro d' inode . Pour tester cela, j'ai créé un lien vers le file. Cependant, lsof affiche toujours le nom d'origine:

 $ ln foo1.txt foo1.link $ stat -c '%n:%i' foo* foo1.link:8429704 foo1.txt:8429704 $ lsof | grep foo | awk '{ print $2,$9 }' 19698 /home/bfernandez/foo1.txt 

Et si je supprime le file original, lsof ne fait que listr le file comme supprimé bien qu'il y ait encore un lien dur existant:

 $ rm foo1.txt rm: remove regular empty file 'foo1.txt'? y $ lsof | grep foo | awk '{ print $2,$9,$10 }' 19698 /home/bfernandez/foo1.txt (deleted) 

Donc finalement …

Ma question

Quelle est la méthode utilisée par lsof pour suivre les descripteurs de files ouverts qui lui permettent de:

  1. Gardez une trace des changements de nom de file
  2. Ne pas être conscient des liens physiques existants

  1. Vous avez raison de supposer que lsof utilise l'inode à partir du cache du nom du kernel. Sous Linux, le nom du path est fourni par le système de files Linux /proc .

  2. La gestion des liens physiques est mieux expliquée dans la FAQ :

3.3.4 Pourquoi ne signale-t-il pas le nom du path d'access du file lié "correct"?

Lorsque lsof signale un composant de nom de path le plus à droite pour un file avec des liens physiques, le composant peut provenir du cache de noms du kernel. Étant donné que la key qui connecte un file ouvert au cache du nom du kernel peut être la même pour chaque lien physique différemment nommé, lsof peut ne signaler qu'un seul nom pour tous les files ouverts ouverts . Parfois, ce sera «correct» dans l'œil du spectateur; parfois, ce ne sera pas le cas. Souvenez-vous que les keys d'identification de file significatives pour le kernel sont les numéros de périphérique et de noeud, et ils sont les mêmes pour tous les noms liés.

Le fait que le noeud supprimé soit affiché est également spécifique à Linux (et aux versions ultérieures de Solaris 10, selon la même FAQ ).