Man kann sync datei
(also mit Dateinamen) verwenden. Oder man kann dd ... of=datei conv=fsync
verwenden. Gibt es noch andere Möglichkeiten, die ich übersehen habe?
Im Skript sicher stellen, dass vor Beendigung alle Dateiänderungen auf Platte geschrieben wurde
Projektleitung
Anmeldungsdatum: Beiträge: 13174 |
|
![]() Anmeldungsdatum: Beiträge: 7782 |
Willst du jetzt noch mehr Befehle wissen, die ein fsync auslösen? Da wäre dann z.B. Eine Stufe höher wäre das umounten (oder remount,ro) des Dateisystems auf dem sich die Datei befindet. Aber abseits von Datenbanken o.ä. macht man das eigentlich nicht. Also da reicht einfach bei cp & co. auf den Exit-Status zu schauen und fertig. Eine interessante Note aus der fsync Manpage:
So gesehen müsste man |
Projektleitung
(Themenstarter)
Anmeldungsdatum: Beiträge: 13174 |
Nicht ganz, auch, wenn sie den selben Syscall benutzen.
Danke.
Viel zu unselektiv und hat außerdem reichlich unerwünschte Nebenwirkungen. Da kann man lieber
Nein, das reicht gerade nicht, wenn man sicher gehen will, dass die Änderungen persistiert sind. Der Exit-Status trifft ja überhaupt keine Aussagen dazu, ob die Datei bereits auf der Platte gespeichert ist oder nicht.
Guter Punkt! |
![]() Anmeldungsdatum: Beiträge: 7782 |
Ja, und sicher gehen wollen z.B. Datenbanken weil die eben auf eine Art und Weise mit Dateien arbeiten, bei der das eine Rolle spielt (eben sektorweise Veränderung mit Metadatenstrukturen die synchron bleiben müssen, gleich wie bei Dateisystemen). Für normale Anwendungen die immer ne ganze Datei auf einmal schreiben ist das weit weniger interessant. Wenn du in einem Editor auf Speichern drückst, wird der normalerweise kein fsync machen, und das hat nichts damit zu tun, daß dein Geschreibsel unwichtig wäre. Was willst du eigentlich machen? |
![]() Anmeldungsdatum: Beiträge: 7782 |
Okay, ich nehm das zurück. nano macht kein fsync vim macht scheinbar fsync emacs kommt drauf an, siehe https://www.gnu.org/software/emacs/manual/html_node/emacs/Customize-Save.html
Wenn beim fsync Fehler auftreten, bist du bei der dd Variante vielleicht besser unterwegs... in der Shell sind "schreib datei; sync datei;" zwei getrennte Aktionen, der Filedescriptor wird da zwischendurch zugemacht, und Fehler werden nur an offene Filedescriptor gemeldet. Wenn da also ein I/O Fehler o.ä. auftritt nach dem Schreiben der Datei aber vor dem Sync, bekommst du das nicht mit. Bei dd bleibt der filedescriptor offen, schreiben und sync ist da somit eine Aktion und nicht getrennt... Aber normalerweise™ tritt dieser Fall so oder so nicht ein. Für Normalsterbliche und wenn du keine besonders außergewöhnliche Anforderungen in deiner Anwendung hast, reicht der normale Exit-Status völlig aus. |