Comment savoir quel fichier est actuellement écrit par un processus

9

Ma situation est que de temps en temps un processus spécifique (dans ce cas, c'est Thunderbird) ne réagit pas aux entrées des utilisateurs pendant une minute environ. J'ai découvert iotopque pendant ce temps, il écrit beaucoup sur le disque, et maintenant je veux savoir dans quel fichier il écrit, mais iotopne donne malheureusement que des statistiques par processus et non par fichier ouvert (-descriptor).

Je sais que je peux utiliser lsofpour savoir quels fichiers le processus a actuellement ouverts, mais bien sûr Thunderbird en a beaucoup ouverts, donc ce n'est pas très utile. iostataffiche uniquement les statistiques par appareil.

Le problème se produit uniquement de manière aléatoire et cela peut prendre un certain temps avant qu'il n'apparaisse, donc j'espère que je n'aurai pas à parcourir Thunderbird et à parcourir de longs journaux pour savoir quel fichier contient le plus d'écritures.

Philipp Wendler
la source
Voir aussi Journalisation des connexions sortantes au fur et à mesure qu'elles se produisent pour les connexions réseau
Gilles 'SO- arrête d'être méchant'

Réponses:

6

Si vous attachez strace au processus juste au moment où il est bloqué (vous pouvez obtenir le pid et mettre la commande en file d'attente à l'avance, dans un terminal de rechange), il affichera le descripteur de fichier de l'écriture bloquante.

Exemple trivial:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached
Inutile
la source
Merci, je ne savais pas que je pouvais attacher strace pendant le processus. Je vais essayer ça.
Philipp Wendler
1
Vous pouvez croiser ces informations avec lsof -p $PID, afin de savoir où pointe le descripteur de fichier
Coren
1
ou ls -l /proc/pid/fdsur Linux
inutile
En utilisant strace, j'ai pu découvrir exactement ce que je voulais savoir, merci encore!
Philipp Wendler
2

Si vous avez un accès root, je pense que le meilleur outil serait le sous-système d'audit . Il n'y a pas beaucoup de littérature à ce sujet (mais plus que sur logsfs); vous pouvez commencer avec ce tutoriel ou un quelques exemples ou tout simplement la auditctlpage de manuel . Ici, il devrait suffire de s'assurer que le démon est démarré, puis exécuté en auditctltant que root:

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

Cela écrit dans les journaux /var/log/audit/audit.logchaque fois que le processus avec le pid 1234 écrit quelque part sous /home/philipp. Les frais généraux sont assez petits, beaucoup plus petits que strace.

Gilles 'SO- arrête d'être méchant'
la source
Merci d'avoir souligné les sous-systèmes d'audit comme une alternative intéressante à strace. Cependant, cela ne semble pas aider ici car il semble que les journaux ne soient ouverts que lorsque le fichier est ouvert, et donc je ne peux pas savoir combien est écrit dans chaque fichier.
Philipp Wendler
@PhilippWendler Ah. Hmmm. Essayez d'ajouter -S read -S write(non testé).
Gilles 'SO- arrête d'être méchant'