Prüfen auf offene Datei

23/07/2012 - 13:20 von Hergen Lehmann | Report spam
Hallo,

ich habe folgendes Problem: Bevor ich eine Datei überschreibe, möchte
ich gerne prüfen, ob noch ein anderer Prozess darauf zugreift. Das Ganze
soll nur der Anzeige einer Warnmeldung dienen, muss also nicht 100%
wasserdicht sein.

Erster Ansatz wàre flock(), aber dummerweise setzt der fremde Prozess
keinen lock, und daran kann ich auch nichts àndern.

Zweiter Ansatz wàre fuser(), aber leider erfordert dies root-Rechte, um
wirklich alle Prozesse (nicht nur die Eigenen) zu sehen. Gleiches gilt
für lsof.

Ignorieren ist auch nicht, denn dann arbeitet der fremde Prozess
kommentarlos (und ggf. über Monate) mit den alten Daten weiter, was zu
gewissen Irritationen beim Bediener führt.

Hat jemand einen Tip, wo ich suchen muß?

TIA,
Hergen
 

Lesen sie die antworten

#1 Rainer Weikusat
23/07/2012 - 13:53 | Warnen spam
Hergen Lehmann writes:
ich habe folgendes Problem: Bevor ich eine Datei überschreibe, möchte
ich gerne prüfen, ob noch ein anderer Prozess darauf zugreift. Das
Ganze soll nur der Anzeige einer Warnmeldung dienen, muss also nicht
100% wasserdicht sein.



Die kurze Anwort lautet: Vergiss es. Uebliche UNIX(*)-Dateisystem
unterscheiden sich vom Windows-Dateisystem in einigen Punkten und das
ist ein solcher: Ein Dateiname ist ein sogenannter 'hard link' von
einem Verzeichniseintrag zu einer bestimmten Datei (typischerweise, zu
deren sogenannte i-node) und die koennen ziemlich frei kommen und
gehen ohne dass das die Datei selber beruehrt: Nachdem ein bestimmter
Verzeichniseintrag benutzt wurde, um eine Datei fuer ein Oeffnen zu
lokalisieren, spielt er keine Rolle mehr.

[...]

Ignorieren ist auch nicht, denn dann arbeitet der fremde Prozess
kommentarlos (und ggf. über Monate) mit den alten Daten weiter, was zu
gewissen Irritationen beim Bediener führt.



Das in diesem Fall uebliche Verfahren waere, den Verzeichniseintrag
'atomic' auf eine neue Datei umzubiegen, in dem man den neuen Inhalt
zuerst in einem temporaere Datei schreibt und den Verzeichniseintrage
via rename(2) aendert, nach dem das Program damit fertig ist.
(gegebenenfalls muss man hier noch verschiedentlich fsyncs einfuegen,
um eine bestimmte Reihenfolge der tatsaechlichen Schreiboperationen
auf dem persistenten Speichermedium zu erzwingen). Falls diese
Tatsache an einen anderen Prozess kommuniziert werden soll, geht das
nur so, dass man diesen entweder beendet und neustartet, oder mit
'kooperativer' IPC, dh dieser Prozess erwartet eine solche
Benachrichtigung und verhaelt sich nach deren Empfang entsprechend
oder in dem der Prozess selber in bestimmten Abstaenden ueberprueft,
ob sich der i-node, auf den der entsprechende Verzeichniseintrag jetzt
zeigt, mittlerweile geaendert hat und die Datei deswegen neu geoeffnet
werden sollte.

Ähnliche fragen