[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Datei "sicher" kopieren
[Thread Prev] | [Thread Next]
- Subject: Re: Datei "sicher" kopieren
- From: Alexander Holler <holler@xxxxxxxxxxxxx>
- Date: Mon, 19 Nov 2007 22:24:12 +0100
- To: uugrn@xxxxxxxxxxxxxxx
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/