Mam zadanie w systemie wsadowym, które działa bardzo długo i generuje mnóstwo danych wyjściowych. Tak bardzo, że muszę przepuścić standardowe wyjście przez gzip, aby węzeł wsadowy nie zapełnił swojego obszaru roboczego, a następnie ulegał awarii.

longscript | gzip -9 > log.gz 

Teraz chciałbym lubię badać wyniki zadania, gdy jest ono jeszcze uruchomione. Więc robię to:

gunzip log.gz 

Działa bardzo długo, ponieważ jest to ogromny plik (kilka GB). Widzę, że plik wyjściowy jest tworzony, gdy jest uruchomiony, i mogę go obejrzeć podczas tworzenia.

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

Jednak ostatecznie gzip napotyka koniec skompresowanego pliku. Ponieważ zadanie nadal działa, a program gzip nadal zapisuje plik, nie ma jeszcze właściwej stopki, więc dzieje się tak:

gzip: log.gz: unexpected end of file 

Następnie wyodrębniony dziennik plik jest usuwany, ponieważ program gzip uważa, że uszkodzone wyodrębnione dane nie są dla mnie przydatne. Jednak nie zgadzam się – nawet jeśli kilka ostatnich wierszy jest zakodowanych, wynik nadal jest dla mnie bardzo interesujący.

Jak mogę przekonać gzip, aby pozwolił mi zachować „uszkodzony” plik?

Komentarze

Odpowiedź

Oprócz samego końca pliku będziesz mógł zobaczyć nieskompresowane dane za pomocą zcat (lub gzip -dc lub gunzip -c):

zcat log.gz | tail 

lub

zcat log.gz | less 

lub

zless log.gz 

gzip zrobi buforowanie z oczywistych powodów (musi skompresować dane w fragmentach), więc nawet jeśli program mógł wypisać jakieś dane, mogą one jeszcze nie znajdować się w log.gz

Możesz również przechowywać nieskompresowany dziennik z

zcat log.gz > log 

… ale byłoby to głupie, ponieważ istnieje oczywiście powód, dla którego skompresowałeś dane wyjściowe w pierwszej kolejności.

Komentarze

  • Zobacz gunzip < log.gz zamiast dla systemów, w których zcat działa tylko w plikach .Z.

Odpowiedź

Jeśli dobrze rozumiem, zechcesz zrobić coś takiego jak tail -f z wciąż rosnącym plikiem gzip file: Mam opracowane gztool , które może to zrobić (między innymi):

$ gztool -T log.gz 

i będzie stale wysyłać do konsoli, czekając na nowe dane, gdy będzie to konieczne.

Zauważ, że gztool utworzy również plik indeksu (log.gzi w tym przypadku), co spowoduje, że przyszłe ogony lub inne losowe dostępy do danych gzip z gztool będą prawie natychmiastowe. Jeśli nie chcesz tworzyć indeksu (nawet jeśli ma on rozmiar 0,3% / gzip i nie wydłużasz czasu przetwarzania), możesz użyć -W, aby go nie tworzyć.

Odpowiedź

Możesz spróbować podzielić plik i zgzipować każdy z nich: https://stackoverflow.com/a/2016918/3090950

W każdym razie, czy mógłbyś uruchomić polecenie w trybie szczegółowym? To dostarczy ci więcej informacji.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *