Jak mogę „cat and follow” pliku?

31

Plik jest kolejno pobierany przez wget.

Jeśli zacznę go rozpakowywać cat myfile.tar.bz2 | tar -xj, może rozpakować się poprawnie lub nie powieść z „Nieoczekiwanym EOF”, w zależności od tego, co jest szybsze.

Jak „cat and follow” pliku, tj. Wyprowadzać zawartość pliku na standardowe wyjście, ale nie wychodzić z EOF, zamiast tego nadal subskrybować ten plik i kontynuować wysyłanie nowych części danych, wychodząc tylko wtedy, gdy plik jest zamknięty przez program zapisujący i nie zostanie ponownie otwarty w ciągu N sekund.


I utworzeniu skryptu cat_and_follow oparciu @ arielCo za odpowiedź , która również kończy tail, gdy plik nie jest otwarty do pisania więcej.

Vi.
źródło
2
Myślę, że szukasz tailpolecenia z opcją Follow.
keshlam
taildziała również z plikami binarnymi?
Vi.
2
Możesz także polubić less +F...
mikeserv
Wiem, że znalazłeś swoje rozwiązanie, ale mam pytanie, dlaczego po prostu nie:wget ... && tar xjvf ...
Joseph R.
@JosephR., 1. Aby zaoszczędzić czas przez równoległe; 2. W celu wyrównania obciążenia systemu (unikanie / minimalizowanie intensywnie korzystających z zasobów fazy rozpakowywania z całkowicie otwartą przepustnicą); 3. Aby uniknąć pamiętania o poleceniu „rozpakuj” później (lub planowania) lub wpisywania polecenia łańcuchowego w pierwszej kolejności (kiedy nie jestem jeszcze pewien, czy chcę go rozpakować).
Vi.

Odpowiedzi:

22
tail +1f file

Testowałem go na Ubuntu z tarballem źródłowym LibreOffice podczas wgetpobierania:

tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf -

Działa również na Solarisie 10, RHEL3, AIX 5 i Busybox 1.22.1 w moim telefonie z Androidem (używać tail +1 -f filez Busybox).

arielCo
źródło
1
Czy automatycznie zakończy się po zakończeniu pobierania? Oczekuję, że „obserwujący” będzie /proc/*/fd/okresowo skanować i sprawdzać, czy plik jest na dobre zamknięty.
Vi.
2
Nie spodziewałem się, że to tailzadziała z plikami binray ...
Vi.
Utworzono skrypt skanujący /proc/../fd i automatyczne zakończenie.
Vi.
1
Nie potrzebujesz ogona GNU, uważam, że ta -fopcja jest standardowa. Jednak nie zakończy się automatycznie po zakończeniu pobierania.
Barmar
4
W Ubuntu tail +1fnie działa. Musisz to zrobićtail -n +1
Dangonfast,
11

Problem polega na tym, że catnie wie się, że plik jest nadal dołączany. Gdy tylko catnapotka (bieżący) koniec pliku, wychodzi.

Musisz wgetnapisać do potoku (lub FIFO), aby tego uniknąć.

wget -O - http://... | tar -xjf -
Hauke ​​Laging
źródło
7
Lub curl, który domyślnie wyświetla wyjście na standardowe wyjście. I (1) -f -jest redundantne, tardomyślnie odczytuje ze standardowego wejścia, a (2) większość tars może automatycznie wykryć kompresję, więc jczęsto jest to niepotrzebne. curl http://... | tar x
Kevin
2
Spowoduje to pobranie bez zapisywania rozpakowanego pliku. Utrudni to także kontynuowanie pobierania w przypadku złej sieci.
Vi.
3
@Vi. Można zapisać plik za pomocą teetak: curl http://… | tee ….tbz | tar -xj, ale wznawianie pobierania pobiera bardziej skomplikowane niż tylko ponownie powołując się na tę samą komendę.
kasperd
5

Aby przeczytać i śledzić plik od początku do momentu przerwania:

tail -fn +1 file

Aby to wykazać, spróbuj tego (zakładając, że Bash z GNU Coreutils):

(while true; do printf . >> /tmp/file; sleep 1; done)&
tail -fn +1 /tmp/file  # (Ctrl-C to interrupt, of course, or otherwise kill it.)
kill %  # Kills the while-loop.

(Uwaga: +1fwspomniane przez innych jest interpretowane jako nazwa pliku, przynajmniej w tailpoleceniu GNU ).

Powyższe działa dla pojedynczego pliku. Łączenie wielu plików nie byłoby w stanie śledzić wszystkich z nich deterministycznie, bez zawieszenia się na pierwszym. Aby „ cat and follow ”, po ostatnim pliku, można użyć podstawienia procesu . Oto kolejna demonstracja:

printf file1 > /tmp/file1; printf file2 > /tmp/file2
(while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)&
cat /tmp/file1 <(tail -fn +1 /tmp/file2)  # (Interrupt or kill it.)
kill %  # Kills the while-loop.
James Haigh
źródło
To działało dla mnie, podczas gdy tail +1f filenie.
therealfarfetchd
Ta odpowiedź jest znacznie lepsza niż w tail +1fpołączeniu z innymi opcjami, takimi jak--pid
Joseph K. Strauss