Czy gzip jest atomowy?

11

Jest gzipatomowy?

Co się stanie, jeśli zatrzymam gzipproces, gdy jest on w trakcie zgrywania pliku?

Jeśli nie jest atomowy, a jeśli już nacisnąłem Ctrl + C w gzip *.txtprocesie, jak mogę bezpiecznie kontynuować?

(Nie jestem ciekawy, jak wznowić, ale także czy gzipkonkretnie jest atomowy).

Wendeta
źródło
Możliwy duplikat Jak wznowić polecenie tar, które zostało zabite
Anthony Geoghegan
4
„jak bezpiecznie wznowić?” _... Użyj CTRL+Zzamiast CTRL+C, następnie zabij lub wznów przerwane zadanie (odpowiada liczbą n[- [n]+ Stopped-- gzip ...], a następnie możesz wznowić z %nlub z fg, lub z bg... w ten sam sposób możesz to zabić kill %n).
Hastur
Kompresuj duży plik, Ctrl-C podczas kompresji, i zobacz, co się stanie.
RonJohn
Nie. Tylko mv jest atomowy, z wyjątkiem ociekania sarkazmem ext4… ale przynajmniej naprawili domyślne opcje montowania jakiś czas temu.
mirabilos

Odpowiedzi:

28

Czy gzip jest atomowy?

Nie. Tworzy skompresowany plik, a następnie usuwa nieskompresowany oryginał.

W szczególności nie kompresuje pliku in situ i jest on przez pewien czas kompresowany, gdy:

  • skompresowany cel jest niekompletny
  • częściowo skompresowany plik i jego źródło istnieją w systemie plików.

Co się stanie, jeśli zatrzymam proces gzip, gdy jest on w trakcie zgrywania pliku?

Jeśli zatrzymać gzipproces z połów sygnału ( SIGINTod Ctrl C, na przykład) będzie oczyszczanie częściowo tworzone pliki. W przeciwnym razie, w zależności od miejsca, w którym zostanie zatrzymany, możesz skończyć z częściowo skompresowanym plikiem obok nietkniętego oryginału.

Jeśli nie jest atomowy, jeśli już nacisnąłem Ctrl + C w procesie gzip * .txt, jak mogę bezpiecznie wznowić?

Usuwasz częściowo skompresowaną wersję (jeśli nadal istnieje) i ponownie uruchamiasz gzip.

roaima
źródło
5
2. dzieje się, gdy proces jest zakończony , gdy nie jest zatrzymana , a zdarza się sygnały spoza rączką (nie ^ C -> SIGINTlub SIGTERMna której gzipinstaluje obsługi sygnałów, które usuwają plik wyjścia).
mosvy
1
@mosvy to robi. Nigdy wcześniej tego nie widziałem. Dziękuję
roaima,
1
Bardzo dokładasz wszelkich starań, aby nie usuwać żadnych spakowanych plików, dla których oryginał został usunięty. Gdy gzip jest zabijany nieregularnie, jest to zwykle jeden plik, zwykle ostatni.
Harfiarz - Przywróć Monikę
@Harper tak. Jeśli zatrzymasz gzipprzepływ w połowie, zawsze będzie tam mały wyścig. Alternatywnie możesz nakazać gzipzawsze zastępowanie plików docelowych, co pomija większość problemów z czyszczeniem.
roaima
15

Nie jest atomowy (interfejs API systemu plików Unix tak naprawdę nie zapewnia żadnego sposobu wykonywania operacji atomowych, które wpływają na wiele plików), ale jest bezpieczny w razie awarii. Skompresowany plik jest nowym plikiem, nie zastępuje oryginału i nie usuwa oryginalnego pliku, dopóki nie zakończy tworzenia skompresowanego pliku (może to powodować problem, jeśli nie masz wystarczającej ilości miejsca na dysku dla oba pliki).

Jeśli pojawi się błąd lub przerwiesz kompresję, oryginalny plik pozostanie niezmieniony. Częściowo skompresowany plik jest zwykle usuwany.

Nie ma możliwości wznowienia go w środku, po prostu zaczynasz od początku.

Barmar
źródło
To sprawia, że ​​zastanawiam się, w jaki sposób można wdrożyć atomowe operacje na wielu plikach. Coś jak transakcje SQL?
val mówi Przywróć Monikę
1
@val Około 30 lat temu pracowałem w zespole, który projektował nowy system operacyjny jako kontynuację Multics / GCOS, a system plików podobny do bazy danych był częścią tego pomysłu. Projekt nigdy jednak nie zaszedł daleko.
Barmar
Usunęli transakcje NTFS, wydaje się nie warte komplikacji. Zmiana nazwy jest najbardziej atomową operacją (pod warunkiem, że korzystasz z tego samego systemu plików i ma on semantykę posix), więc zmiana nazwy (po close / fsync) z temp na nazwę końcową zapewniłaby, że nieskompresowany plik jest co najmniej kompletny. Możesz obejść te problemy za pomocą rur (które mają własne tryby częściowej awarii)
eckes
@eckes Tak długo, jak usuwa oryginał po zamknięciu skompresowanego pliku, nie potrzebujesz atomowej zmiany nazwy. Jeśli nie ma oryginału, możesz mieć pewność, że skompresowany plik jest kompletny. Potrzebujesz atomowej zmiany nazwy dla operacji zastępujących oryginalny plik (np sed -i.).
Barmar
@Barmar, jeśli chcesz wyzwalać tylko przez istnienie pliku docelowego (co robi wiele przepływów pracy odpytywania katalogu), lepiej upewnij się, że plik jest kompletny. Jeśli nie uruchomisz się na nim lub wykryjesz niekompletne pliki, sprawdzając, czy istnieje źródło, nic ci nie będzie bez ostatecznej zmiany nazwy.
eckes
4

Nie musisz się tym martwić, ponieważ gziptworzy nowy .gzplik, zapełnia go skompresowaną zawartością, a następnie usuwa oryginalny plik. Więc jeśli zatrzymasz proces w środku, nie wpłynie to na oryginalny plik.

dr_
źródło
3

.txtpliki, które zostały już pomyślnie przetworzone, gzipzostaną zastąpione .txt.gzplikami skompresowanymi, dzięki czemu można bezpiecznie uruchomić gzip *.txtponownie - tylko pliki, które nie zostały jeszcze przetworzone, zostaną skompresowane.

Plik, który był przetwarzany przez gzip w momencie naciśnięcia Ctrl-C będzie niemodyfikowana - gzip nie zastąpi go dopiero po pomyślnym ściskając go.

cas
źródło
0

Nie, to bardzo nieatomowe. Może to wpędzić cię w poważne kłopoty, jeśli spakujesz plik, do którego czasami dołącza się plik, na przykład dziennik internetowy.

Gzip czyta, tworzy plik .gz (z bieżącym znacznikiem czasu), kopiuje znacznik czasu oryginalnego pliku, a następnie usuwa oryginał.

Niektóre przerwy mogą pozostawić zbłąkany, niedokończony .txt.gzplik tuż obok .txtpliku. Powoduje to problem z integralnością danych: jaki jest prawdziwy plik? Czy to jest

  • gzip, który zawiódł, pozostawiając niekompletny / uszkodzony .txt.gz? Lub
  • wystrzał, który zawiódł, pozostawiając niekompletny / obcięty .txtplik? Lub
  • Plik został pomyślnie spakowany txt.gzi nowo utworzony .txt plik?

(To ostatnie dzieje się, gdy przejdziesz do katalogu dziennika HTTP i przejdziesz gzip *).

Generalnie uważam, że rozsądne jest rozwiązywanie tego ręcznie, chyba że dokładnie wiesz, co się stało, ponieważ właśnie to zrobiłeś.

Na szczęście gzip zwykle działa szeregowo, więc powinieneś mieć ten problem tylko z jednym plikiem. Paralelowanie gzip nie jest dobrym pomysłem - nawet jeśli w pełni wykorzysta procesor, spowoduje uszkodzenie dysku, zmuszając go do odczytania kilku plików jednocześnie, znacznie spowalniając wszystkie gzipy. Z drugiej strony SSD lub RAMdisk ...

Harper - Przywróć Monikę
źródło
1
@roaima. Rzeczywiście, polegałem na slangu, którego używaliśmy dawno temu w jednym miejscu, w którym pracowałem. Korekta do wspólnej definicji.
Harper - Przywróć Monikę
1
Jeśli masz zamiar głosować, zostaw komentarz wyjaśniający dlaczego.
JBentley,