Comment surveiller les fichiers ouverts

9

Existe-t-il un outil pour surveiller quels processus ouvrent quels fichiers sur le système afin que vous puissiez suivre quel processus continue de toucher un fichier spécifique?

Lsof peut savoir si vous l'exécutez pendant que le processus a le fichier ouvert, mais s'il s'agit d'un processus de courte durée qui s'exécute de temps en temps, vous ne pouvez pas l'attraper avec lsof. Besoin de quelque chose qui utilise le traçage du noyau.

psusi
la source
Avez-vous vérifié inotify? Voir la réponse de @ Kees ici par exemple: askubuntu.com/questions/25442/… Il y a quelques liens sur ma réponse ici: askubuntu.com/questions/29566/…
belacqua
@jgbelacua, ni l'un ni l'autre n'est tout à fait ce que je recherche. Inotify peut vous dire quand un fichier donné est touché, et lsof peut vous dire quels fichiers un processus a ouverts, ou quel processus a un fichier ouvert, mais j'ai besoin de comprendre quel processus continue de toucher un fichier, puis de le fermer avant de pouvoir exécutez lsof pour l'attraper.
psusi

Réponses:

7

Vous pourriez peut-être utiliser un système d'audit pour cela. C'est un peu lourd, mais quelque chose comme ça devrait fonctionner (dans /etc/audit/audit.rules):

# delete all other rules
-D

# watch the file in question
-w /path/to/file -p rwxa

puis je pense que vous devez redémarrer auditd:

sudo service audit restart

(Si vous ne l'avez pas installé, il se trouve dans le package auditd.) Le coupable peut alors être trouvé dans /var/log/audit/audit.log.

taneli
la source
Parfait! C'est exactement ce que je cherchais.
psusi
0

Malheureusement, le mécanisme utilisé par Linux pour permettre de surveiller des fichiers est inotify, qui ne fournit pas suffisamment d'informations pour extraire des données utiles: vous obtenez uniquement le nom du fichier et l'action qui a été effectuée.

J'ai essayé d'utiliser quelque chose comme ça:

sudo inotifywait -mr somedir --format "%w%f" | while read file; do echo -n "$file => ";lsof -b $file; echo ""; done

Cela écoute pour inotifier les événements sur le répertoire spécifié et pour chaque événement, il exécute lsof pour essayer d'attraper le processus qui touche le fichier. Malheureusement pour la plupart des accès que j'ai testés (comme l'utilisation d'un éditeur pour écrire dans un fichier), la commande LSOF est juste de ralentir et ne parvient pas à intercepter le processus incriminé.

Si vos processus effectuent des E / S plus intensives sur les fichiers problématiques, votre kilométrage peut varier. Bonne chance.

Guss
la source
0

fnotifystat est un outil qui a été conçu pour surveiller l'activité des fichiers Linux

sudo apt-get install fnotifystat
sudo fnotifystat
Total   Open  Close   Read  Write   PID  Process         Pathname
  7.0    1.0    1.0    5.0    0.0   2075 libvirtd        /proc/cpuinfo
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu0/topology/physical_package_id
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu1/topology/physical_package_id
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu2/topology/physical_package_id
  6.0    2.0    2.0    2.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu3/topology/physical_package_id
  4.0    1.0    1.0    2.0    0.0   2075 libvirtd        /sys/devices/system/node
  4.0    1.0    1.0    2.0    0.0   2075 libvirtd        /sys/devices/system/node/node0
  4.0    2.0    2.0    0.0    0.0  15313 gnome-calendar  /usr/share/zoneinfo/Europe/London
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu0/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu1/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu2/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu2/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu3/topology/core_id
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/cpu3/topology/thread_siblings_list
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/online
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/cpu/present
  3.0    1.0    1.0    1.0    0.0   2075 libvirtd        /sys/devices/system/node/node0/meminfo
  2.0    0.0    0.0    0.0    2.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-release.log
  1.0    0.0    0.0    0.0    1.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-desktop.log
  1.0    0.0    0.0    0.0    1.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-devel.log
  1.0    0.0    0.0    0.0    1.0  12174 xchat           /home/cking/.xchat2/xchatlogs/FreeNode-#ubuntu-kernel.log

Afficher les 10 premiers fichiers actifs toutes les 60 secondes jusqu'à l'arrêt:

sudo fnotifystat -t 10 60

Afficher l'activité du fichier toutes les 10 secondes seulement 6 fois:

sudo fnotifystat 10 6

Afficher l'activité des fichiers de Thunderbird et l'ID de processus 1827:

sudo fnotifystat -p thunderbird,1827

Affichez chaque événement de notification de fichier et les 20 principaux fichiers d'activité actifs sur une seule période de 5 minutes:

sudo sudo notifystat -v -d -c 5m 1

Affichez simplement chaque événement de notification de fichier sur / sys et / proc et aucune statistique périodique:

sudo fnotifystat -n -i /sys,/proc

Consultez la page de manuel fnotifystat pour plus d'informations, c'est un outil assez flexible.

Colin Ian King
la source