Чи gzip атомний?


11

Є чи gzipатомна?

Що станеться, якщо я зупиняю gzipпроцес, поки він знаходиться в середині gzipping файла?

Якщо це не атомно, і якщо я вже натискав Ctrl + C під час gzip *.txtпроцесу, як я безпечно відновлю?

(Мені цікаво не лише відновлення відновлення, а й питання, чи gzipконкретно є атомним.)



4
"як я безпечно відновити?" _... Використовуйте CTRL+Zзамість CTRL+C, а потім вбийте або відновіть роботу, яка перервана (вона відповідає числом n[- [n]+ Stopped-- gzip ...], тоді ви можете відновити з %nабо з fg, або з bg... таким же чином ви можете вбити його kill %n).
Hastur

Під час стискання стисніть великий файл Ctrl-C і подивіться, що станеться.
RonJohn

Ні. Тільки mv є атомним, за винятком крапельного сарказму ext4, але принаймні вони виправили типові параметри кріплення за замовчуванням.
mirabilos

Відповіді:


28

Чи gzip атомний?

Ні. Він створює стислий файл, а потім видаляє нестиснений оригінал.

Зокрема, він не стискає файл in situ, і існує певний проміжок часу, коли файл стискається де,

  • стиснута мішень неповна
  • частково стислий файл та його джерело існують у файловій системі.

Що станеться, якщо я зупиняю процес gzip, поки він знаходиться в середині gzipping файла?

Якщо ви зупините gzipпроцес із сигналом, який можна вловити ( SIGINTвід Ctrl C, наприклад), він очистить частково створені файли. Інакше, залежно від того, на якому місці він зупинений, ви можете отримати частково стислий файл поряд із недоторканим оригіналом.

Якщо це не атомно, якщо я вже натиснув Ctrl + C у процесі gzip * .txt, як я безпечно відновлю?

Ви видаляєте частково стиснуту версію (якщо вона все ще існує) та перезапускаєте gzip.


5
2-е відбувається, коли процес припиняється , а не коли він зупиняється , і відбувається лише для не оброблених сигналів (не для ^ C -> SIGINTабо SIGTERMдля яких gzipвстановлює обробники сигналів, які видаляють вихідний файл).
mosvy

1
@mosvy так і робить. Я ніколи цього не бачив. Дякую
roaima

1
Ви вкрай обережно ставитесь до того, щоб не видалити gzipped файли, для яких видалено оригінал. Коли gzip вбивається нерегулярно, зазвичай це один файл, як правило, останній.
Харпер -

@Harper так. Якщо ви зупиняєте gzipсередину потоку, там завжди є крихітна гонка. Крім того, ви gzipзавжди можете перезаписати цільові файли, що усуває більшість проблем очищення.
roaima

15

Це не атомна (файлова система API Unix на насправді не забезпечують який - або спосіб для виконання атомарних операцій , які впливають на кілька файлів), але це є відмовостійкої. Стислий файл - це новий файл, він не перезаписує оригінал, і він не видаляє вихідний файл, поки не завершиться створення стисненого файлу (це насправді може спричинити проблему, якщо у вас недостатньо місця на диску для обидва файли).

Якщо він отримав помилку або ви перервали стиснення, вихідний файл залишиться незмінним. Частково стислий файл зазвичай буде видалений.

Немає можливості відновити його в середині, ви просто запускаєте його з початку.


Це змушує мене замислитися над тим, як, можливо, можна було б реалізувати атомні багатофайлові операції. Щось на зразок транзакцій SQL?
val каже

1
@val Близько 30 років тому я був у команді, яка розробляла нову ОС як послідовник Multics / GCOS, і файлова система, схожа на базу даних, була частиною ідеї. Проект ніколи не зайшов дуже далеко.
Бармар

Вони видалили транзакції NTFS, схоже, не варто ускладнюватись. Перейменування - це найбільш атомна операція (якщо ви перебуваєте в одній файловій системі та має сексику позікса), тож перейменування (після закриття / fsync) від temp до остаточного імені забезпечить принаймні повне стискання файлу. Ви можете
подолати

@eckes Поки він видаляє оригінал після закриття стисненого файлу, вам не потрібно атомне перейменування. Якщо оригіналу немає, ви можете бути впевнені, що стислий файл закінчений. Вам потрібна атомна перейменування для операцій, які замінюють вихідний файл (наприклад sed -i).
Бармар

@Barmar, якщо ви хочете запустити лише існування цільового файлу (який роблять багато робочих процесів опитування каталогів), краще переконайтеся, що файл заповнений. Якщо ви не запускаєте це або не зможете виявити неповні файли, перевіривши наявність джерела, тоді вам все вдається без остаточного перейменування.
eckes

4

Вам не потрібно турбуватися про це, оскільки gzipстворює новий .gzфайл, заповнює його стислим вмістом, а потім видаляє вихідний файл. Тож якщо ви зупините процес посередині, це не вплине на ваш початковий файл.


3

.txtфайли, які вже успішно оброблені, gzipбудуть замінені .txt.gzстиснутими файлами, тому ви можете безпечно запустити gzip *.txtзнову - стискатимуться лише ті файли, які ще не оброблені.

Файл , який оброблявся з допомогою Gzip в момент натискання Ctrl-C буде незміненій - GZIP не замінить його , поки після успішного його стиснення.


0

Ні, це дуже не атомічно. Це може спричинити великі проблеми, якщо ви gzip файл, який періодично додається, наприклад веб-журнал.

Gzip читає, створює .gz файл (з поточною міткою часу), копіює часову позначку оригінального файлу, а потім видаляє оригінал.

Певні перерви можуть залишити .txt.gzнеподалік незавершений файл поруч із .txtфайлом. Потім створюється проблема цілісності даних: який справжній файл? Це

  • gzip, який не вдався, залишивши незавершеним / зіпсованим .txt.gz? Або
  • невдалий пістолет, залишивши неповний / усічений .txtфайл? Або
  • У файлі успішно зібрано файл txt.gz, а новостворений .txt файл?

(Останнє трапляється, коли ви заходите у свій каталог журналів HTTP і переходите gzip *)

Я, як правило, вважаю доцільним розбирати це вручну, якщо ви точно не знаєте, що сталося, тому що ви це просто зробили.

На щастя, gzip зазвичай працює серійно, тому у вас повинна бути ця проблема лише з одним файлом. Паралелінг gzip не є хорошою ідеєю - навіть якщо він буде використовувати процесор більш повно, він розтрощить диск, змусивши його читати відразу декілька файлів, що значно уповільнює всі gzip. SSD або RAMdisk, з іншого боку ...


1
@roaima. Дійсно, я покладався на сленг, який ми давно використовували в одному місці, де я працював. Виправлення загального визначення.
Харпер -

1
Якщо ви збираєтесь звернутись до бюджету, залиште коментар, пояснюючи чому.
JBentley
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.