Ist gzip atomar?


11

Ist gzipatomar?

Was passiert, wenn ich den gzipVorgang stoppe , während gerade eine Datei komprimiert wird?

gzip *.txtWie kann ich sicher fortfahren , wenn es nicht atomar ist und ich bei einem Prozess bereits Strg + C gedrückt habe ?

(Ich bin nicht nur neugierig, wie ich weitermachen soll, sondern auch, ob es gzipspezifisch atomar ist.)


Mögliches Duplikat von Wie kann ich einen getöteten
Teerbefehl

4
"Wie kann ich sicher fortfahren?" _... Verwenden Sie CTRL+Zstatt CTRL+C, beenden Sie den unterbrochenen Job oder setzen Sie ihn fort (er antwortet mit einer Zahl n[- [n]+ Stopped-- gzip ...], dann können Sie mit %noder mit fgoder mit bg... auf die gleiche Weise fortfahren du kannst es mit töten kill %n).
Hastur

Komprimieren Sie eine große Datei, Strg-C beim Komprimieren, und sehen Sie, was passiert.
RonJohn

Nein. Nur mv ist atomar, außer bei ext4… Sarkasmus tropft, aber zumindest haben sie vor einiger Zeit die Standard-Mount-Optionen behoben.
Mirabilos

Antworten:


28

Ist gzip atomar?

Nein. Es wird eine komprimierte Datei erstellt und dann das unkomprimierte Original entfernt.

Insbesondere ist es nicht um eine Datei zu komprimieren in situ , und es gibt eine Zeitperiode , während die Datei in dem komprimiert wird,

  • Das komprimierte Ziel ist unvollständig
  • Die teilweise komprimierte Datei und ihre Quelle sind beide im Dateisystem vorhanden.

Was passiert, wenn ich den gzip-Prozess stoppe, während eine Datei gzippt?

Wenn Sie den Stopp - gzipProzess mit einem abfangbare Signal ( SIGINTvon Ctrl Czum Beispiel) wird es Bereinigung teilweise Dateien erstellt. Andernfalls wird je nach dem Punkt, an dem es gestoppt wird, möglicherweise eine teilweise komprimierte Datei neben dem unberührten Original angezeigt.

Wenn es nicht atomar ist und ich bei einem gzip * .txt-Prozess bereits Strg + C gedrückt habe, wie kann ich dann sicher fortfahren?

Sie löschen die teilweise komprimierte Version (falls noch vorhanden) und starten die neu gzip.


5
Der zweite Vorgang findet statt , wenn der Prozess beendet wird , nicht wenn er gestoppt ist , und nur für nicht behandelte Signale (nicht für ^ C -> SIGINToder SIGTERMfür die gzipSignalhandler installiert werden, die die Ausgabedatei entfernen).
Mosvy

1
@ Mosvy so tut es. Das habe ich noch nie gesehen. Vielen Dank
Roaima

1
Sie achten sehr darauf, dass Sie keine komprimierten Dateien löschen, für die das Original gelöscht wurde. Wenn gzip unregelmäßig beendet wird, ist dies normalerweise eine Datei, normalerweise die letzte.
Harper - Reinstate Monica

@ Harper ja. Wenn Sie mitten im gzipFluss anhalten , gibt es dort immer eine winzige Rennbedingung. Alternativ können Sie gzipfestlegen, dass Zieldateien immer überschrieben werden sollen, wodurch die meisten Bereinigungsprobleme umgangen werden.
Roaima

15

Es ist nicht atomar (die Unix-Dateisystem-API bietet keine Möglichkeit, atomare Vorgänge auszuführen, die mehrere Dateien betreffen), aber es ist ausfallsicher. Die komprimierte Datei ist eine neue Datei, überschreibt das Original nicht und löscht die Originaldatei erst, wenn die komprimierte Datei vollständig erstellt wurde (dies kann tatsächlich zu Problemen führen, wenn Sie nicht über genügend Speicherplatz verfügen beide Dateien).

Wenn ein Fehler auftritt oder Sie die Komprimierung unterbrechen, bleibt die Originaldatei unverändert. Die teilweise komprimierte Datei wird normalerweise entfernt.

Es gibt keine Möglichkeit, es in der Mitte fortzusetzen. Sie beginnen es einfach von vorne.


Dies lässt mich darüber nachdenken, wie möglicherweise atomare Multifile-Operationen implementiert werden könnten. So etwas wie SQL-Transaktionen?
Val sagt Reinstate Monica

1
@val Vor ungefähr 30 Jahren war ich in einem Team, das ein neues Betriebssystem als Multics / GCOS-Nachfolger entwarf, und ein datenbankähnliches Dateisystem war Teil der Idee. Das Projekt kam jedoch nie sehr weit.
Barmar

Sie haben NTFS-Transaktionen entfernt, scheint die Komplikation nicht wert zu sein. Das Umbenennen ist die atomarste Operation (solange Sie sich im selben Dateisystem befinden und über eine Posix-Semantik verfügen). Wenn Sie also (nach close / fsync) vom temporären zum endgültigen Namen umbenennen, wird sichergestellt, dass die unkomprimierte Datei mindestens vollständig ist. Sie können diese Probleme mit der Verwendung von Rohren (die ihre eigenen Teilausfallmodi haben)
umgehen

@eckes Solange das Original nach dem Schließen der komprimierten Datei gelöscht wird, muss der Atom nicht umbenannt werden. Wenn das Original nicht mehr vorhanden ist, können Sie sicher sein, dass die komprimierte Datei vollständig ist. Sie benötigen eine atomare Umbenennung für Vorgänge, die die Originaldatei ersetzen (z sed -i. B. ).
Barmar

@Barmar Wenn Sie nur durch das Vorhandensein der Zieldatei auslösen möchten (was bei vielen Verzeichnisabruf-Workflows der Fall ist), sollten Sie sicherstellen, dass die Datei vollständig ist. Wenn Sie dies nicht auslösen oder unvollständige Dateien erkennen können, indem Sie prüfen, ob die Quelle vorhanden ist, sind Sie ohne die endgültige Umbenennung in Ordnung.
eckes

4

Sie müssen sich darüber keine Gedanken machen, da gzipeine neue .gzDatei erstellt, mit dem komprimierten Inhalt gefüllt und dann die Originaldatei gelöscht wird. Wenn Sie den Vorgang in der Mitte stoppen, wirkt sich dies nicht auf Ihre Originaldatei aus.


3

.txtDateien, die bereits erfolgreich von verarbeitet gzipwurden, wurden durch .txt.gzkomprimierte Dateien ersetzt, sodass Sie sie sicher gzip *.txtwieder ausführen können. Nur die Dateien, die noch nicht verarbeitet wurden, werden komprimiert.

Die Datei, die zum Zeitpunkt des Drückens von Strg-C von gzip verarbeitet wurde, bleibt unverändert. Gzip ersetzt sie erst nach erfolgreicher Komprimierung.


0

Nein, es ist sehr unatomar. Dies kann zu großen Problemen führen, wenn Sie eine Datei gzipen, an die gelegentlich angehängt wird, z. B. ein Weblog.

Gzip liest, erstellt die GZ-Datei (mit dem aktuellen Zeitstempel), kopiert den Zeitstempel der Originaldatei und löscht dann das Original.

Bestimmte Unterbrechungen können eine verirrte, unfertige .txt.gzDatei direkt neben der .txtDatei hinterlassen . Dies führt dann zu einem Datenintegritätsproblem: Welches ist die eigentliche Datei? Ist das

  • ein gzip, das fehlgeschlagen ist und ein unvollständiges / beschädigtes hinterlassen hat .txt.gz? Oder
  • Ein Gunzip, der fehlgeschlagen ist und eine unvollständige / abgeschnittene .txtDatei hinterlassen hat ? Oder
  • Eine erfolgreich gezippte Datei txt.gzund eine neu erstellte .txt Datei?

(Letzteres passiert, wenn Sie in Ihr HTTP-Protokollverzeichnis gehen und gehen gzip *).

Ich finde es im Allgemeinen ratsam, dies von Hand zu klären, es sei denn, Sie wissen genau, was passiert ist, weil Sie es gerade getan haben.

Glücklicherweise arbeitet gzip normalerweise seriell, sodass Sie dieses Problem nur mit einer Datei haben sollten. Das Parallelschalten von gzip ist keine gute Idee - obwohl die CPU stärker ausgelastet ist, wird die Festplatte überlastet, sodass mehrere Dateien gleichzeitig gelesen werden müssen, wodurch alle gzip-Dateien erheblich verlangsamt werden. SSD oder RAMdisk dagegen ...


1
@roaima. Wir haben uns in der Tat auf einen Slang verlassen, was bedeutet, dass wir ihn vor langer Zeit an einem Ort verwendet haben, an dem ich gearbeitet habe. Korrektur der allgemeinen Definition.
Harper - Reinstate Monica

1
Wenn Sie abstimmen wollen, hinterlassen Sie bitte einen Kommentar, in dem erklärt wird, warum.
JBentley
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.