[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Datei "sicher" kopieren


Hallo Peter,

Peter Mueller wrote:
> Hallo,
> 
> ich habe auf einem Linksys Router ein kleines System zur 
> Messwerterfassung laufen. Die Messwerte laufen mit verschiedenen 
> Zykluszeiten aber insgesamt ca. alle 15min einer in eine rrd Datenbank 
> ein. Die DB liegt im Flash.
> 
> Um das Flash zu schonen wollte ich die DB in eine Ramdisk legen und dann 
> einmal im Tag ins Flash umkopieren.
> 
> Frage:
> Was passiert wenn gerade der eine Job die Kopie macht und der andere Job 
> versucht auf die DB schreibend zuzugreifen. Faengt sowas das Dateisystem 
> ab oder muss ich irgendwie auf Cron Ebende eine Verriegelung machen oder 
> muesste das RRD eigentlich abfangen ...?
> 
> Dumm waere es wenn die Sicherung aufgrund eines Schreibkonflikts korrupt 
> waere.

Lass einfach den Job, der die Daten in die rrd-DB schreibt, auch die 
Kopie vom RAM ins Flash machen. Z.b. mit einem Counter in einer Datei in 
der RAM-Disk. Dann sparst du dir jegliche Frickelei mit Dateisperren 
o.ae. weil du sicher bist, es bearbeitet nur ein Prozess die DB.

Ansonsten muesstest du erst einmal feststellen, wie der Prozess, der in 
die DB schreibt, diese oeffnet. cp oeffnet die Datei garantiert nur zum 
lesen und nicht exklusiv (bin mir zwar nicht hundertprozentig sicher, es 
ist aber das, was ich als einzig sinnvoll ansehe), d.h. das open des 
schreibende Prozess bestimmt, was genau passiert. Wenn er die Datei, die 
er beschreibt mit exklusiven Zugriff oeffnet, schlaegt ein cp zur gleichen 
Zeit fehl. Macht er dies nicht, kannst du andernfalls nicht sicher sein, 
dass die (kopierte) DB  funktionsfaehig ist. Das koennte der schreibende 
Prozess zwar auch sicherstellen, ich vermute aber, dass solche Infos, 
falls ueberhaupt, nur im Quellcode zu finden sind.

Eine weitere Moeglichkeit die Prozesse zu synchronisieren, besteht z.B. 
darin, dass du eine (leere) Datei zur Synchronisation benutzt. D.h. beide 
Prozesse versuchen diese Datei, falls nicht vorhanden, anzulegen (man 
tempfile), und starten ihre Arbeit nur, falls das erfolgreich war. Ist 
die Datei bereits vorhanden, wird einfach, z.B. per Schleife und 
sleep(1), gewartet bis sie weg ist (bzw. bis das Anlegen der Datei 
erfolgreich ist).

Gruss,

Alexander


-- 
http://mailman.uugrn.org/mailman/listinfo/uugrn
Wiki: http://wiki.uugrn.org/wiki/UUGRN:Mailingliste
Archiv: http://lists.uugrn.org/