Является ли gzip атомным?

11

Является ли gzipатомная?

Что произойдет, если я остановлю gzipпроцесс, пока он находится в процессе архивирования файла?

Если это не атомарно, и если я уже нажал 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… сарказмом, но, по крайней мере, они исправили параметры монтирования по умолчанию некоторое время назад.
Мирабилось

Ответы:

28

Является ли gzip атомным?

Нет. Он создает сжатый файл, а затем удаляет несжатый оригинал.

В частности, он не сжимает файл на месте, и существует период времени, когда файл сжимается, где,

  • сжатая цель не завершена
  • частично сжатый файл и его источник существуют в файловой системе.

Что произойдет, если я остановлю процесс gzip, пока он находится в процессе сжатия файла?

Если остановить gzipпроцесс с catchable сигнала ( SIGINTот Ctrl C, например) будет частично очистки созданных файлов. В противном случае, в зависимости от точки остановки, вы можете получить частично сжатый файл рядом с нетронутым оригиналом.

Если это не атомарно, если я уже нажал Ctrl + C в процессе gzip * .txt, как мне безопасно возобновить?

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

roaima
источник
5
2-е происходит, когда процесс завершается , а не когда он останавливается , и происходит только для необработанных сигналов (не для ^ C -> SIGINTили SIGTERMдля которых gzipустанавливаются обработчики сигналов, которые удаляют выходной файл).
Мосви
1
@Mosvy, так оно и есть. Я никогда не видел этого раньше. Спасибо
Ройма
1
Вы очень внимательно следите за тем, чтобы убедиться, что вы не удалили сжатые файлы, для которых был удален оригинал. Когда gzip прерывается нерегулярно, это обычно один файл, обычно последний.
Харпер - Восстановить Монику
@ Харпер да. Если вы останавливаете gzipсредний поток, там всегда есть крошечные расы. В качестве альтернативы вы можете указать gzipвсегда перезаписывать целевые файлы, что обходит большинство проблем очистки.
Роайма
15

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

В случае ошибки или прерывания сжатия исходный файл останется без изменений. Частично сжатый файл обычно удаляется.

Там нет никакого способа возобновить его в середине, вы просто начинаете это с самого начала.

Barmar
источник
Это заставляет меня задуматься о том, как, возможно, могут быть реализованы атомарные многофайловые операции. Что-то вроде транзакций SQL?
говорит
1
@val Около 30 лет назад я работал в команде, разрабатывающей новую ОС в качестве последователя Multics / GCOS, и файловая система, похожая на базу данных, была частью этой идеи. Проект никогда не продвигался далеко.
Бармар
Они удалили транзакции NTFS, кажется, не стоит осложнений. Переименование - это самая элементарная операция (если вы находитесь в одной файловой системе с семантикой posix), поэтому переименование (после close / fsync) с временного на конечное имя обеспечит, по крайней мере, завершение несжатого файла. Вы можете обойти эти проблемы с помощью конвейеров (которые имеют свои собственные режимы частичного отказа)
eckes
@eckes Пока оригинал удаляется после закрытия сжатого файла, вам не нужно атомарное переименование. Если оригинал пропал, вы можете быть уверены, что сжатый файл завершен. Вам необходимо атомарное переименование для операций, которые заменяют исходный файл (например sed -i).
Бармар
@ Barmar, если вы хотите запускать только по наличию целевого файла (что делают многие рабочие процессы опроса каталогов), лучше убедиться, что файл завершен. Если вы не активируете этот файл или можете обнаружить неполные файлы, проверив наличие источника, то все будет в порядке без окончательного переименования.
eckes
4

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

dr_
источник
3

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

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

саз
источник
0

Нет, это очень неатомично. Это может привести к большим неприятностям, если вы скопируете файл, к которому иногда добавляются, например, веб-журнал.

Gzip читает, создает файл .gz (с текущей меткой времени), копирует метку времени исходного файла, а затем удаляет оригинал.

Некоторые прерывания могут оставить неподходящий .txt.gzфайл рядом с .txtфайлом. Это тогда создает проблему целостности данных: что является реальным файлом? Это

  • gzip, который потерпел неудачу, оставив неполный / поврежденный .txt.gz? Или
  • Gunzip, который не удалось, оставив неполный / усеченный .txtфайл? Или
  • Файл успешно заархивирован txt.gz, а недавно созданный .txt файл?

(Это происходит в последний раз, когда вы заходите в каталог журналов HTTP и уходите gzip *).

Я обычно считаю целесообразным разобраться с этим вручную, если вы не знаете точно, что произошло, потому что вы только что сделали это.

К счастью, gzip обычно работает последовательно, поэтому у вас должна быть проблема только с одним файлом. Распараллеливание gzip не является хорошей идеей - даже если он будет использовать процессор более полно, он будет разбивать диск, заставляя его читать несколько файлов одновременно, значительно замедляя работу всех gzip. SSD или RAMdisk, с другой стороны ...

Харпер - Восстановить Монику
источник
1
@roaima. В действительности, я полагался на сленг, который мы использовали давным-давно в одном месте, где я работал. Исправление к общему определению.
Харпер - Восстановить Монику
1
Если вы собираетесь понизить голосование, пожалуйста, оставьте комментарий, объясняющий почему.
Дж.Бентли