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órychzcat
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.
gunzip -c
zapisuje dane wyjściowe na standardowe wyjście … może to ' s czego szukasz? Zachowuje oryginał niezmieniony.