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?

Sebastian Hoitz
źródło

Odpowiedzi:

213

Czy masz na myśli

tail -f logfile.log

?

( Strona podręcznika dla ogona )

Jon Skeet
źródło
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).

Murali Suriar
źródło
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
richvdh
źródło
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.

Jon Ericson
źródło
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.

trent
źródło
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"`.

oliphaunt
źródło
1
oglądać katalogi i ich zawartość zamiast jednego pliku:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy,
8

możesz użyć komendy tailf, która jest najłatwiejsza

tailf logfile.log
reegan vijay
źródło
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.

Jaskółka oknówka
źródło
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ę.

hlovdal
źródło
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.

deinspanjer
źródło
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.

Mezmer
źródło
1

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

phantomastray
źródło
4
Myślę, że to wszystko ujęto w tej odpowiedzi sprzed 7 lat.
kasperd