2011-07-26 9 views
18

Potrzebuję rozwiązania w tworzeniu skryptu, który będzie gotowy do odtworzenia pliku dziennika, który zostanie odtworzony (o tej samej nazwie) po osiągnięciu określonego rozmiaru.Jak korzystać z ogona, aby wyświetlić plik dziennika, który jest często ponownie tworzony?

Użycie opcji "ogon -f" powoduje zatrzymanie ogłaszania po odtworzeniu/obróceniu pliku.

Co chciałbym zrobić, to utworzyć skrypt, który będzie wskazywał plik, a po osiągnięciu 100 wierszy, na przykład następnie uruchom ponownie polecenie ... lub jeszcze lepiej, aby ponownie uruchomić polecenie po odtworzeniu pliku? czy coś takiego jest możliwe?

Dzięki!

Odpowiedz

2

spróbuj uruchomić

watch "tail -f" yourfile.log 
+0

Zegarek jest niedostępny w systemie, którego używam niestety – gfunk

15

Tak! Użyj tej (na powtórzenie uczyni ogon powtórzenie gdy plik nie istnieje lub jest niedostępny w inny sposób, a nie tylko w przypadku braku - jak potencjalnie podczas zmiany plików):

tail -f --retry <filename> 

LUB

tail --follow=name --retry 

OR

tail -F <filename> 
+0

Wygląda na to, że zadziała on świetnie, ale pojawia się błąd. – gfunk

+0

~> tail -f --follow = nazwa --retry /logs/logs/log.log ogon: nie można otworzyć wejścia – gfunk

+0

Wygląda na to, że masz '/ logs evan

0

Skoro nie masz ogon, który obsługuje wszystkie funkcje i dlatego nie masz zegarek można użyć prostego skryptu, który w pętli bez końca, aby wykonać ogon.

#!/bin/bash 

PID=`mktemp` 
while true; 
do 
    [ -e "$1" ] && IO=`stat -c %i "$1"` 
    [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; } 

    # as long as the file exists and the inode number did not change 
    while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]] 
    do 
    sleep 0.5 
    done 
    [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID 
    sleep 0.5 
done 2> /dev/null 
rm -rf $PID 

Możesz użyć pułapki, aby oczyścić ten skrypt. To zależy od Ciebie.

Zasadniczo ten skrypt sprawdza, czy numer i-węzła (używając stat -c %i "$1") zmienia się, aby zabić polecenie tail i rozpocząć nowe, gdy plik zostanie odtworzony.

Uwaga: możesz pozbyć się echo "restarting tail", który zanieczyści twoje wydruki. Był przydatny tylko do testowania. Mogą również wystąpić problemy, jeśli plik zostanie wymieniony po sprawdzeniu numeru i-węzła i zanim rozpoczniemy proces ogona.

2

Jeśli tail -f jest nie dostępna, a ty próbujesz odzyskać logrotate, można dodać opcję copytruncate do pliku logrotate.d/ specyfikacji więc zamiast tworzenia nowego pliku za każdym razem, po obrocie, plik jest trzymany i przycinany, a kopia jest obracana.

W ten sposób stary uchwyt pliku nadal wskazuje nowy plik dziennika (truncated), do którego dodawane są nowe dzienniki.

Należy pamiętać, że w trakcie tego procesu może nastąpić utrata danych.

Powiązane problemy