Linux Dateibenutzung durch Prozesse
Willemers Informatik-Ecke

Prozesse öffnen Dateien, um sie zu lesen oder zu schreiben. Die Zusammenhänge zwischen beiden können Sie mit den Befehlen fuser und lsof ermitteln. So können Sie feststellen, welcher von den vielen Prozessen in eine bestimmte Datei schreibt, oder prüfen, welche Dateien durch einen bestimmten Prozess verwendet werden.

fuser

Mit dem Befehl fuser können Sie feststellen, welche Prozesse eine Datei im Zugriff haben. Der Befehl erwartet eine Datei oder ein Verzeichnis als Argument. Er zeigt daraufhin die PID aller Prozesse, die diese derzeit im Zugriff haben.
$ fuser meinedatei.txt
meinedatei.txt:              1176  1190
Ein Verzeichnis als Argument liefert auch die Information, welcher Prozess unterhalb dieses Verzeichnisses gestartet wurde. Dies ist vor allem dann hilfreich, wenn Sie ein Laufwerk überraschenderweise nicht aushängen können. Sie bekommen nämlich nicht die Erlaubnis, einem Prozess einfach den Boden unter den Füßen wegzuziehen.

lsof

Das Programm lsof (list of open files) zeigt alle offenen Dateien und die Prozesse, die diese offen halten, an. Das ist im laufenden Betrieb eines Linux-Computers eine ganze Menge und so wird diese Datenmenge wohl kaum jemand lesen, ohne zu filtern. Für das Filtern von Prozess-IDs kennt lsof die Option -p. Aber auch dann kann es sinnvoll sein, die Ausgaben seitenweise zu betrachten.
$ lsof -p 7170 | more
Die Überschrift der Tabelle lautet:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Natürlich sind die Spalten durch Leerzeichen getrennt, sodass Sie sie auch mit awk auswerten können.

Die Frage, welche Prozesse eine bestimmte Datei im Zugriff haben, beanwortet fuser bereits. Der Befehll lsof fragt, welche Dateien von einem bestimmten Prozess geöffnet wurden. Dazu filtert man die zweite Spalte, um bei einem Treffer die neunte Spalte anzuzeigen:

$ lsof | awk '{ if ($2==7170) print $9 }'
Falls Ihnen die Aufrufsyntax von awk nicht auf Anhieb einfällt, können Sie über die Ausgabe von lsof natürlich auch einen grep 7170 absetzen, müssen dann allerdings von Hand die Zeilen ausfiltern, bei denen die 7170 an anderer Stelle als in der zweiten Spalte erscheint.

Alternativ geht auch:

$ lsof -p 7170 | awk '{ print $9 }'