Nowe posty

Autor Wątek: Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).  (Przeczytany 4845 razy)

egreg

  • Gość
Witam
Muszę stworzyć skrypt który będzie sprawdzał każdy nowy wiersz z osobna na bieżąco jak tylko się pojawi w logu (nie mam na myśli loga systemowgo tylko aplikacji).
Prosiłbym o jakiś pomysły jakimi poleceniami można to w elegancki sposób zrealizować ( chodzi mi o sam odczyt)
Chciałem to zrealizować w petli gdzie najpierw byłoby sprawdzane czy jest nowy wiersz w pliku , następnie odczyt , analiza zawartości wiersza , wykonanie poleceń w zależności od zawartości wiersza.
Problem mam właśnie z samym odczytem pojedyńczych kolejnych wierszy ze stale powiększającego się logu.
Pozdrowienia.

chmooreck

  • Gość
Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).
« Odpowiedź #1 dnia: 2009-05-05, 13:10:34 »
man tail

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).
« Odpowiedź #2 dnia: 2009-05-05, 13:24:53 »
> man tail

Przyda się jeszcze "man stat" i w sumie fragmenty "man bash" :)


Bash średnio nadaje się do takich rzeczy. Jego zadaniem jest uruchomić zadanie polecenia i się zakończyć. Nie pozwala np. otworzyć pliku, przejść na koniec i czekać na nowe dane. Dlatego lepiej by było napisać to w C/C++.

Ale w Bashu też się da.


Musisz sprawdzać czy rozmiar pliku się nie zwiększył, wczytywać nowe znaki (man tail), a je dzielić na poszczególne linie i obrabiać.

Wyjątkowo umieszczę gotowca. Jeśli jesteś ambitny, to spróbuj najpierw sam :)

#!/bin/bash

FILE="log.txt"


filesize1=$( stat -c "%s" "$FILE" )
filesize2=$filesize1

while true; do

while [ $filesize2 -eq $filesize1 ]; do
sleep 0.01
filesize2=$( stat -c "%s" "$FILE" )
done

((filesize1++))  # skip file's last byte
while read line; do
# ...
echo "Linia: ${line}"
# ...
done < <( tail -c +${filesize1} "$FILE" )

filesize1=$filesize2

done

chmooreck

  • Gość
Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).
« Odpowiedź #3 dnia: 2009-05-05, 14:12:29 »
myślałem raczej o przekierowaniu wyjścia z taila uruchomionego z opcją -f ;-)

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).
« Odpowiedź #4 dnia: 2009-05-05, 15:54:44 »
o_O

Nie zauważyłem tej opcji. A dokładnie to nie była opisana na którymś z webowych manuali, na który trafiłem :/

W tej sytuacji oczywiście użycie "tail -f" jest znacznie lepszym rozwiązaniem od tego co podałem wyżej.

egreg

  • Gość
Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).
« Odpowiedź #5 dnia: 2009-05-05, 21:10:02 »
Dziekuję za odpowiedzi , pierwsza propozycja jest dla mnie zrozumiała , natomiast nie mam pojęcia jak można  wykorzystać "tail -f" w moim przypadku.
Przecież to polecenie działa w swojej własnej nie kończącej się pętli.
 Jak mam wykorzystać wynik jego działania w moim skrypcie , który musi na bieżąco sprawdzać każdy pojedyńczy wiersz z osobna i zależnie od jego zawartości wykonać sekwencję poleceń ?.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Odczyt pojedyńczych wierszy z pliku loga (stale powiekszającego się).
« Odpowiedź #6 dnia: 2009-05-05, 22:11:39 »
Użyć:
while read line; do
  # ...
  echo "Linia: ${line}"
  # ...
done < <( tail -f ................ )
już bez całej reszty tego mojego kodu.