So finden Sie heraus, welche Datei gerade von einem Prozess geschrieben wird

9

Meine Situation ist, dass von Zeit zu Zeit ein bestimmter Prozess (in diesem Fall Thunderbird) etwa eine Minute lang nicht auf Benutzereingaben reagiert. Ich iotophabe in dieser Zeit herausgefunden, dass es ziemlich viel auf die Festplatte schreibt, und jetzt möchte ich herausfinden, in welche Datei es schreibt, aber leider iotopgibt es nur Statistiken pro Prozess und nicht pro geöffneter Datei (-descriptor).

Ich weiß, dass ich lsofdamit herausfinden kann, welche Dateien der Prozess gerade geöffnet hat, aber Thunderbird hat natürlich viele davon geöffnet, daher ist dies nicht so hilfreich. iostatZeigt nur Statistiken pro Gerät an.

Das Problem tritt nur zufällig auf und es kann einige Zeit dauern, bis es auftritt. Ich hoffe, ich muss Thunderbird nicht belasten und durch lange Protokolle waten, um herauszufinden, welche Datei die meisten Schreibvorgänge aufweist.

Philipp Wendler
quelle
Siehe auch Protokollieren ausgehender Verbindungen, wie sie für Netzwerkverbindungen auftreten
Gilles 'SO - hör auf böse zu sein'

Antworten:

6

Wenn Sie dem Prozess nur dann eine Strace hinzufügen, wenn er hängen bleibt (Sie können die PID abrufen und den Befehl im Voraus in einem Ersatzterminal in die Warteschlange stellen), wird der Dateideskriptor des blockierenden Schreibvorgangs angezeigt.

Triviales Beispiel:

$ 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
Nutzlos
quelle
Danke, ich wusste nicht, dass ich Strace anbringen kann, während der Prozess läuft. Ich werde es versuchen.
Philipp Wendler
1
Sie können diese Informationen mit kreuzen lsof -p $PID, um zu wissen, wo der Dateideskriptor zeigt
Coren
1
oder ls -l /proc/pid/fdunter Linux
Nutzlos
Mit strace konnte ich tatsächlich genau herausfinden, was ich wissen wollte, also nochmals vielen Dank!
Philipp Wendler
2

Wenn Sie Root-Zugriff haben, denke ich, dass das beste Tool das Audit-Subsystem wäre . Es gibt nicht viel Literatur darüber (aber mehr als über loggedfs); Sie können beginnen mit diesem Tutorial oder ein paar Beispiele oder einfach nur mit der auditctlman - Seite . Hier sollte es ausreichen, um sicherzustellen, dass der Dämon gestartet und dann auditctlals root ausgeführt wird:

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

Dies schreibt /var/log/audit/audit.logjedes Mal in Protokolle, wenn der Prozess mit pid 1234 irgendwo darunter schreibt /home/philipp. Der Overhead ist ziemlich klein, viel kleiner als strace.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank, dass Sie auf die Audit-Subsysteme als interessante Alternative zu strace hingewiesen haben. Hier scheint es jedoch nicht zu helfen, da es nur beim Öffnen der Datei protokolliert zu werden scheint und ich daher nicht herausfinden kann, wie viel in jede Datei geschrieben ist.
Philipp Wendler
@PhilippWendler Ah. Hmmm. Versuchen Sie es -S read -S write(ungetestet).
Gilles 'SO - hör auf böse zu sein'