ubuntuusers.de

inotify gibt geänderte Datei doppelt aus

Status: Gelöst | Ubuntu-Version: Xubuntu 22.04 (Jammy Jellyfish)
Antworten |

Fried-rich

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1126

Hallo,

ich möchte mit inotify eine einzelne Datei in /tmp überwachen (Erstellung und Änderung). Das hab eich so gemacht:

1
2
3
4
5
6
inotifywait -mrq -e create,close_write --format %f /tmp/ | while read FILE
do
  if [ "$FILE" = datei ]; then
    echo "Die Datei $FILE wurde gerade erstellt oder geändert."
  fi
done

'create' reagiert wenn die Datei neu erstellt wurde und 'close_write' wenn die Datei nach dem Schreibvorgang geschlossen wurde. Wenn die Datei schon vorhanden ist und geändert wird sollte echo genau einmal ausgeführt werden, denn die Datei wird ja nur einmal geschlossen. echo kommt aber immer genau 2x. Wieso?

Bei 'modify' kommen andere Meldungen, z. B.

Die Datei .goutputstream-J9XHX2 wurde gerade erstellt oder geändert.

Das scheint eine Art temporäre Datei zu sein (?), da inotify in dem Moment reagiert wo der Speichervorgang beginnt und dann nicht wieder. 'close_wite' reagiert, wenn er abgeschlossen ist.

Bearbeitet von rklm:

Syntaxhighlighting. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 227

Wohnort: Aachen

Moin,

Fried-rich schrieb:

ich möchte mit inotify eine einzelne Datei in /tmp überwachen

wieso dann der Schalter

        -r|--recursive  Watch directories recursively.

?

Wenn die Datei schon vorhanden ist und geändert wird sollte echo genau einmal ausgeführt werden, denn die Datei wird ja nur einmal geschlossen. echo kommt aber immer genau 2x. Wieso?

Womit wurde die Datei geändert?

Ich würde mal vermuten, dass das Programm die Datei nicht überschrieben, sondern disese zuvor umbenannt oder gelöscht hat - somit bekommst du anschließend 2 Meldungen, einmal für "create" und einmal für "close_write".

Was passiert, wenn du das Event mit prüfst und die Datei überschrieben wird?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
inotifywait -mrqe create,close_write --format "%f %e" /tmp/ | while read FILE EVENT
do
  if [ "$FILE" = "datei" ]; then
    if [[ "$EVENT" =~ ^CREATE ]];then
      echo "Die Datei $FILE wurde erstellt."
    else
      echo "Die Datei $FILE wurde geändert."
    fi
  fi
done

Gruß Thomas

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13022

Normalerweise ist das einzig sinnvolle Event, auf das man warten soll, "close_write" - egal, ob eine Datei neu angelegt oder geändert wird. Ein Beispiel habe ich früher schon mal geschrieben. Da fehlt nur -q.

Fried-rich

(Themenstarter)

Anmeldungsdatum:
2. Mai 2013

Beiträge: 1126

TK87 schrieb:

Was passiert, wenn du das Event mit prüfst und die Datei überschrieben wird?

Dann kommt 2x die Datei wurde geändert. "Überschreiben" heißt bei mir aber ich öffne die Datei, ändere etwas und schließe sie wieder.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13022

Fried-rich schrieb:

TK87 schrieb:

Was passiert, wenn du das Event mit prüfst und die Datei überschrieben wird?

Dann kommt 2x die Datei wurde geändert. "Überschreiben" heißt bei mir aber ich öffne die Datei, ändere etwas und schließe sie wieder.

Kommt halt drauf an, mit welchem Programm Du das machst. Manche erzeugen eine neue Datei, manche überschreiben die bestehende. Wenn Du verstehen willst, das da passiert, ist strace ein gutes Helferlein.

Antworten |