Mám práci v dávkovém systému, který běží extrémně dlouho a produkuje spoustu výstupů. Vlastně tolik, že musím poslat standardní výstup přes gzip, aby dávkový uzel nevyplnil pracovní plochu a následně nezhroutil.
longscript | gzip -9 > log.gz
Teď bych rádi prozkoumáme výstup úlohy, která ještě běží. Udělám to takto:
gunzip log.gz
To běží velmi dlouho, protože je to obrovský soubor (několik GB). Vidím, jak se výstupní soubor vytváří, když je spuštěný, a můžu se na něj dívat, zatímco se staví.
tail log > some-line-of-the-log-file tail log > some-other-line-of-the-log-file
Nakonec však gzip narazí na konec souboru gzip. Jelikož úloha stále běží a soubor gzip stále píše, dosud neexistuje žádná patička, takže k tomu dojde:
gzip: log.gz: unexpected end of file
Poté bude extrahovaný protokol soubor je odstraněn, protože gzip si myslí, že poškozená extrahovaná data pro mě nejsou k ničemu. Já však nesouhlasím – i když jsou poslední řádky zakódovány, výstup je pro mě stále velmi zajímavý.
Jak mohu přesvědčit gzip, aby mi nechal „poškozený“ soubor?
Komentáře
Odpověď
Kromě úplného konce souboru uvidíte nekomprimovaná data pomocí zcat
(nebo gzip -dc
nebo gunzip -c
):
zcat log.gz | tail
nebo
zcat log.gz | less
nebo
zless log.gz
gzip
provede vyrovnávací paměť ze zřejmých důvodů (je třeba data komprimovat v blocích), takže i když program možná některá data odeslal, tato data ještě nemusí být v log.gz
soubor.
Nekomprimovaný protokol můžete uložit také pomocí
zcat log.gz > log
… ale to by bylo hloupé, protože existuje důvod, proč komprimujete výstup na prvním místě.
Komentáře
- Viz
gunzip < log.gz
místo pro systémy, kdezcat
funguje pouze v souborech.Z
.
Odpověď
Pokud správně rozumím, chtěli byste udělat něco jako tail -f
se stále rostoucím gzipem soubor: Vyvinul jsem gztool , který to může udělat (mimo jiné):
$ gztool -T log.gz
a bude na konzoli nepřetržitě vystupovat a čekat na nová data, až to bude nutné.
Všimněte si, že gztool
také vytvoří indexový soubor (log.gzi
v tomto případě), díky kterému budou budoucí ocasy nebo jiné náhodné přístupy k datům gzip téměř
. Pokud nechcete vytvořit index (i když má velikost 0,3% / gzip a nezvyšuje dobu zpracování), můžete jej vytvořit pomocí -W
.
Odpověď
Můžete se pokusit soubor rozdělit a každý z nich gzipovat: https://stackoverflow.com/a/2016918/3090950
Můžete spustit příkaz v podrobném režimu? Získáte tak více informací.
gunzip -c
zapisuje výstup do standardního výstupu … možná, že ' to, co hledáte? Zachovává původní beze změny.