Polecenie powłoki do monitorowania zmian w pliku - jak się nazywa ponownie?


159

Wiem, że na Uniksie było polecenie, którego mogłem użyć do monitorowania pliku i zobaczenia zmian, które są do niego zapisywane. Było to bardzo przydatne szczególnie do sprawdzania plików dziennika.

Czy wiesz jak to się nazywa?

Odpowiedzi:


213

Czy masz na myśli

tail -f logfile.log

?

( Strona podręcznika dla ogona )


6
Tak, to czas rzeczywisty.
Adam Gibbins

18
Uwaga: Jeśli twoja dystrybucja udostępnia polecenie tailf, użyj tego zamiast tail -f. tailf jest bardziej wydajny, ponieważ nie musi uzyskiwać dostępu do oglądanego pliku, jeśli nie jest zapisywany (dostęp do ankiety jest denerwujący, jeśli podłączyłeś system plików z aktualizacją atime).
Mihai Limbăşan

10
U superużytkownika znalazłem odpowiedź polecającą tail -F zamiast -f , także
Rafa

17
tail -Fpodąża za nazwami plików, a nie obiektami plików, co jest szczególnie przydatne w przypadku rotacji pliku dziennika.
Amir Ali Akbari,

2
Aktualizacja, kilka lat później: tailfjest już przestarzała i tail -fbezpieczna. (potwierdź to w swoim systemie za pomocą man tailf.) Zobacz dokumentację: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Prawdopodobnie miałeś na myśli ogon, zgodnie z odpowiedzią Jona Skeeta.

Kolejnym przydatnym jest zegarek ; pozwala okresowo uruchamiać polecenie i wyświetlać pełny ekran wyjściowy. Na przykład:

obejrzyj -n 10 -d ls -l / var / adm / messages

Uruchomi polecenie ls -l /var/adm/messagesco 10 sekund i podświetli różnicę w wynikach między kolejnymi przebiegami. (Przydatne na przykład do obserwowania, jak szybko rośnie plik dziennika).


38

inotifywaitfrom inotify-tools jest przydatny, jeśli chcesz uruchomić polecenie za każdym razem, gdy zmienia się plik (lub dowolne pliki w katalogu). Na przykład:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

Tylko uwaga, która pathnie jest najlepszym wyborem dla nazwy zmiennej. Tak zsh, wydaje się, że zmienne środowiskowe nie uwzględniają wielkości liter. Dla mnie ustawienie pathpowoduje PATHrównież ustawienie, a to w zasadzie oznacza, że ​​nic nie zostanie wykonane, dopóki go nie naprawisz. Włączone bashustawienie pathnie ma wpływu na PATH.
Thanatos

36

Wolę używać less +FG1 niż, tail -fponieważ muszę przeszukać plik dziennika w poszukiwaniu określonego błędu lub identyfikatora. Jeśli muszę coś wyszukać, piszę, ^Caby przestać śledzić plik i ?rozpocząć wyszukiwanie do tyłu.

Wiązania klawiszy są prawie takie same jak w vi. Każde polecenie można zainicjować podczas uruchamiania, używając +opcji:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

W przypadku naprawdę długich dzienników uważam, że wygodnie jest skorzystać z -nopcji wyłączającej numerację linii. Z strony podręcznika:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Porada dla rgmarchy za wskazanie tego w komentarzach.


Pamiętaj, aby ustawić aliasżądane opcje, abyś nie musiał wpisywać ich za każdym razem.
Michael Hampton

Właściwie w większości przypadków powinieneś raczej preferować funkcje powłoki niż aliasy.
tripleee

21

Ogon jest świetny ... mniej można również użyć mniej w pliku, tzn. Mniej mój plik, a następnie naciśnij Shift+ F. To mniej działa jak ogon.


5
mniej + F
mój

16

Edytuję plik LaTeX i chciałem go również monitorować pod kątem zmian gdzieś pośrodku. Wymyśliłem następujący skrypt powłoki, który okazał się dla mnie użyteczny. Mam nadzieję, że przyda się także komuś innemu.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Zapisz to watch.shi zrób chmod u+x watch.sh. Następnie wykonuję to w następujący sposób:

./watch.sh file.tex pdflatex

Jeśli chcesz, aby polecenie było uruchamiane tylko w przypadku faktycznej modyfikacji, możesz użyć `md5sum "$FILE"`zamiast `ls -l "$FILE"`.


1
oglądać katalogi i ich zawartość zamiast jednego pliku:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy,


6

Możesz także użyć inotifywatch / inotifywait, które podpinają się do podsystemu inotify jądra. W ten sposób możesz także obserwować takie rzeczy jak „otwórz”, „zamknij” lub „dostęp”.

Ale jeśli po prostu chcesz uzyskać dołączone linie na standardowe wyjście, zgadzam się na ogon.


3

Tail jest standardowym, tradycyjnym, dostępnym wszędzie narzędziem uniksowym. Nieco bardziej zaawansowanym narzędziem jest multitail, który może monitorować kilka plików jednocześnie i wyróżnia składnię.


3

Jeśli chcę mieć możliwość przeszukiwania całego pliku oprócz samego dostosowywania go, używam go mniej z poleceniem „F”.

Korzystając z tail, pamiętaj, że potrzebne są dodatkowe argumenty, jeśli plik może być zmieniany lub zastępowany przez edycję (domyślny tryb dla vima: w).

tail -f spowoduje, że tail zapisze deskryptor pliku i podąży za nim. Jeśli plik zostanie zastąpiony, deskryptor zostanie zmieniony. Zaletą zastosowania deskryptora pliku jest to, że jeśli nazwa pliku zostanie zmieniona, nadal będziesz go przestrzegać.

tail --follow = sprawi, że tail śledzi nazwany plik, otwierając go okresowo, aby sprawdzić, czy został zastąpiony.

--retry to kolejna przydatna opcja, jeśli chcesz dostosować plik dziennika, ale plik nie został jeszcze utworzony.

tail -F to skrót od --follow = --retry.


2

Zapomnij o tailf, diff to polecenie, które chcesz. Oto dobra sztuczka, aby obserwować różnice występujące w czasie rzeczywistym (lub zamykające) między 2 plikami lub w jednym zapisywanym pliku.

Możesz użyć tych metod, aby zmodyfikować zachowanie w dowolny sposób, na przykład zapisać zmiany w pliku, aby zachować zapis. Pobaw się z interwałem oglądania lub innymi opcjami dla poniższych poleceń.

Masz 1 plik i chcesz oglądać, jak wprowadzane są w nim zmiany:

Więc oto, co robić:

  1. skopiuj plik

cp file file2

  1. napisz skrypt bash, aby znaleźć różnice i zaktualizuj plik2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Oto podstawowy pomysł na scenariusz. Jeśli chcesz, zapisz go do pliku

#!/bin/bash

diff file file2

cp file file2

  1. Następnie możesz oglądać różnice na ekranie za pomocą zegarka

watch ./check-differences

będzie to aktualizować domyślnie co 2 sekundy. Więc jeśli musisz wrócić i je przeczytać, zapisz wynik diff do pliku w skrypcie.

lub użyj crona do regularnego uruchamiania skryptu, jeśli nie potrzebujesz zobaczyć danych wyjściowych.


1

Podczas tail -f somefile.txtprzewijania z nowymi danymi czasami wolę less +G somefile.txtteż spojrzeć na łatkę najnowszych danych w pliku.


4
Myślę, że to wszystko ujęto w tej odpowiedzi sprzed 7 lat.
kasperd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.