gzip: неожиданный конец файла с - как все равно прочитать файл


9

У меня есть работа над пакетной системой, которая работает очень долго и производит тонны продукции. На самом деле так много, что мне нужно передать стандартный вывод через gzip, чтобы пакетный узел не заполнил свою рабочую область и впоследствии не вышел из строя.

longscript | gzip -9 > log.gz

Теперь я хотел бы изучить результаты работы, пока она еще выполняется. Итак, я делаю это:

gunzip log.gz

Это выполняется очень долго, так как это огромный файл (несколько ГБ). Я вижу выходной файл, созданный во время его работы, и могу посмотреть, как он создается.

tail log
> some-line-of-the-log-file
tail log
> some-other-line-of-the-log-file

Однако, в конечном итоге, gzip встречает конец файла gzip. Поскольку задание все еще выполняется, а gzip все еще записывает файл, правильного нижнего колонтитула пока нет, поэтому это происходит:

gzip: log.gz: unexpected end of file

После этого извлеченный файл журнала удаляется, так как gzip считает, что поврежденные извлеченные данные бесполезны для меня. Я, однако, не согласен - даже если последние несколько строк зашифрованы, вывод все еще очень интересен для меня.

Как я могу убедить gzip оставить мне «поврежденный» файл?


gunzip -cзаписывает вывод в stdout ... может быть, это то, что вы ищете? Сохраняет оригинал без изменений.
бретоника

Ответы:


5

Помимо самого конца файла, вы сможете увидеть несжатые данные с помощью zcat(или gzip -dc, или gunzip -c):

zcat log.gz | tail

или

zcat log.gz | less

или

zless log.gz

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

Вы также можете хранить несжатый журнал с

zcat log.gz > log

... но это было бы глупо, потому что, очевидно, есть причина, по которой вы сжимаете выходной файл.


1
Смотрите gunzip < log.gzвместо zcat log.gzсистем, где zcatработает только в .Zфайлах.
Стефан

1

Если я правильно понимаю, вы хотели бы сделать что-то похожее tail -fна все еще растущий файл gzip: я разработал gztool, который может сделать это (среди прочего):

$ gztool -T log.gz

и он будет постоянно выводить на консоль, ожидая новых данных, когда это необходимо.

Обратите внимание, что gztoolтакже будет создан индексный файл ( log.gziв данном случае), который будет делать последующие хвосты или другие случайные обращения к данным gzip gztoolпрактически мгновенно. Если вы не хотите создавать индекс (даже если он равен 0,3% / gzip и не увеличивают время обработки), вы можете использовать его, -Wчтобы не создавать.


0

Вы можете попробовать разделить файл и сжать каждый из них: https://stackoverflow.com/a/2016918/3090950

Во всяком случае, вы могли бы запустить команду в подробном режиме? Это предоставит вам больше информации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.