У меня есть работа в пакетной системе, которая выполняется очень долго и выдает тонны выходных данных. На самом деле, так много, что мне приходится пропускать стандартный вывод через 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
В любом случае, можете ли вы запустить команду в подробном режиме? Это даст вам больше информации.