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

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

У меня есть работа в пакетной системе, которая выполняется очень долго и выдает тонны выходных данных. На самом деле, так много, что мне приходится пропускать стандартный вывод через 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: log.gz: unexpected end of file

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

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

решение1

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

zcat log.gz | tail

или

zcat log.gz | less

или

zless log.gz

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

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

zcat log.gz > log

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

решение2

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

$ gztool -T log.gz

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

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

решение3

Вы можете попробовать разделить файл и сжать каждую его часть с помощью gzip:https://stackoverflow.com/a/2016918/3090950

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

Связанный контент