LibreOffice-Dateien überwachen mit inotify

 5. Juni 2024 •  Ekkart •  Computer, LibreOffice, Linux •  Computer

Dateien auf Änderungen überwachen, das geht mit inotify sehr einfach, vorausgesetzt, die Datei existiert schon:

$ inotifywait --monitor test.txt
Setting up watches.
Watches established.
test.txt OPEN
test.txt ATTRIB
test.txt CLOSE_WRITE,CLOSE
...

überwacht die Datei “test.txt” und gibt aus, wenn sie geöffnet, geändert, geschrieben etc. wird.

Das funktioniert leider für LibreOffice-Dateien nicht, weil inotify die Datei überwacht, der der beim Aufruf gültige inode zugewiesen ist, inotify arbeitet nicht auf Dateinamen.

Beispiel:

$ ls -i test.ods
221542298 test.ods

Die Datei hat derzeit den inode 221542298 und dieser inode wird auf Änderungen überwacht. Bei der Textdatei und den meisten anderen Dateien wird die Datei bei Änderungen direkt überschrieben, damit ändert sich der inode nicht.

LibreOffice schreibt Änderungen erst in eine tmp-Datei, löscht die alte Datei und benennt die tmp-Datei um. Wird schon seinen Grund haben. Damit ändert sich aber der inode auf den der tmp-Datei.

Lässt sich prima nachvollziehen (Ausgabe gefiltert nach den relevanten Dateien für test.ods):

$ ls -i test.ods
221542298 test.ods
$ inotifywait --monitor .
./ OPEN test.ods
./ ACCESS test.ods
./ CLOSE_NOWRITE,CLOSE test.ods
./ CLOSE_WRITE,CLOSE test.ods
./ CREATE lu178702pxy2.tmp
./ OPEN lu178702pxy2.tmp
./ CLOSE_WRITE,CLOSE lu178702pxy2.tmp
./ MOVED_FROM lu178702pxy2.tmp
./ MOVED_TO test.ods
./ ATTRIB test.ods
./ OPEN test.ods
./ CLOSE_WRITE,CLOSE test.ods
$ ls -i test.ods
221542297 test.ods

Das ist misslich, denn so können wir die Datei nicht wie oben im Einzeiler überwachen. Für mich habe ich folgendes Script geschrieben, das das Event moved_to überwacht:

MONITORFILE=test.ods

if [ ! -f $MONITORFILE ]
then
	echo "$MONITORFILE not found!"
	exit 1
fi

echo "waiting for changes..."
inotifywait --monitor --event moved_to . | while read DIRECTORY EVENT FILE
do
	if [ "$FILE" = "$MONITORFILE" ]
	then
		echo "do something for $DIRECTORY $EVENT $FILE"
	fi
done

Sicher noch verbesserungswürdig, für meine Zwecke reicht es erst einmal und das Mysterium, warum die Änderungen von test.ods nicht vollständig gemonitort wurden, ist gelöst 😁