Является ли gzip
атомная?
Что произойдет, если я остановлю gzip
процесс, пока он находится в процессе архивирования файла?
Если это не атомарно, и если я уже нажал Ctrl + C в gzip *.txt
процессе, как мне безопасно возобновить?
(Мне не просто интересно, как возобновить, но также и о том, gzip
является ли конкретно атомным.)
command-line
gzip
вендетта
источник
источник
CTRL+Z
вместоCTRL+C
, затем убейте или возобновите прерванную работу (она отвечает числомn
[-[n]+ Stopped-- gzip ...
], затем вы можете продолжить с%n
или сfg
, или сbg
... таким же образом Вы можете убить это сkill %n
).Ответы:
Нет. Он создает сжатый файл, а затем удаляет несжатый оригинал.
В частности, он не сжимает файл на месте, и существует период времени, когда файл сжимается, где,
Если остановить
gzip
процесс с catchable сигнала (SIGINT
от Ctrl C, например) будет частично очистки созданных файлов. В противном случае, в зависимости от точки остановки, вы можете получить частично сжатый файл рядом с нетронутым оригиналом.Вы удаляете частично сжатую версию (если она все еще существует) и перезапускаете
gzip
.источник
SIGINT
илиSIGTERM
для которыхgzip
устанавливаются обработчики сигналов, которые удаляют выходной файл).gzip
средний поток, там всегда есть крошечные расы. В качестве альтернативы вы можете указатьgzip
всегда перезаписывать целевые файлы, что обходит большинство проблем очистки.Это не атомная (файловая система API Unix на самом деле не обеспечивают какой - либо способ для выполнения атомарных операций , которые влияют на несколько файлов), но это является отказоустойчивой. Сжатый файл - это новый файл, он не перезаписывает исходный файл и не удаляет исходный файл, пока не завершит создание сжатого файла (это может вызвать проблемы, если на диске недостаточно места для оба файла).
В случае ошибки или прерывания сжатия исходный файл останется без изменений. Частично сжатый файл обычно удаляется.
Там нет никакого способа возобновить его в середине, вы просто начинаете это с самого начала.
источник
sed -i
).Вам не нужно беспокоиться об этом, потому что
gzip
создает новый.gz
файл, заполняет его сжатым содержимым, а затем удаляет исходный файл. Так что если вы остановите процесс посередине, это не повлияет на ваш исходный файл.источник
.txt
файлы, которые были успешно обработаны,gzip
будут заменены.txt.gz
сжатыми файлами, поэтому вы можете безопасно запустить ихgzip *.txt
снова - будут сжаты только те файлы, которые еще не были обработаны.Файл , который обрабатывался с помощью Gzip в момент нажатия Ctrl-C будет неизмененной - GZIP не заменит его , пока после успешного его сжатия.
источник
Нет, это очень неатомично. Это может привести к большим неприятностям, если вы скопируете файл, к которому иногда добавляются, например, веб-журнал.
Gzip читает, создает файл .gz (с текущей меткой времени), копирует метку времени исходного файла, а затем удаляет оригинал.
Некоторые прерывания могут оставить неподходящий
.txt.gz
файл рядом с.txt
файлом. Это тогда создает проблему целостности данных: что является реальным файлом? Это.txt.gz
? Или.txt
файл? Илиtxt.gz
, а недавно созданный.txt
файл?(Это происходит в последний раз, когда вы заходите в каталог журналов HTTP и уходите
gzip *
).Я обычно считаю целесообразным разобраться с этим вручную, если вы не знаете точно, что произошло, потому что вы только что сделали это.
К счастью, gzip обычно работает последовательно, поэтому у вас должна быть проблема только с одним файлом. Распараллеливание gzip не является хорошей идеей - даже если он будет использовать процессор более полно, он будет разбивать диск, заставляя его читать несколько файлов одновременно, значительно замедляя работу всех gzip. SSD или RAMdisk, с другой стороны ...
источник