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, kde zcat 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í.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *