محلل سجل الوقت الحقيقي - الوصول إلى الملفات كل بضع ثوان
-
21-12-2019 - |
سؤال
أنا أكتب سيناريو بسيط في باش ، لتحليل بعض السجلات في الوقت الحقيقي ، ويتساءل عن كيفية التعامل مع حقيقة ، أن كل بضع ثوان لا بد لي من العثور على مكان في الملف الذي انتهيت من القراءة في المرة السابقة.الآن أنا أفعل شيئا من هذا القبيل:
LOG_FILE=path_to_file
DELAY=1 #time between refresh
LINES=100 #lines to read at one cycle
LAST=$(tail -n 1 $LOG_FILE)
IFS=$'\n'
while true;
do
clear;
found=0
LOG=$(tail -n $LINES $LOG_FILE)
for line in $LOG
do
if [ $line = $LAST ]; then
found=1
continue
fi
if [ $found = 0 ]; then
continue
fi
#Analyzing counting nd stuff.
echo "$stuff"
done
LAST=$line
sleep $DELAY;
done
لذلك كل دورة أنا جلب بعض عدد من الخطوط من نهاية الملف وتبحث عن واحد الذي كان الأخير في المدى السابق.هذا وسوف تعمل موافق تماما حتى في دورة واحدة أكثر من ذلك سيتم إضافة عدد محدد من خطوط.يمكنني دائما أن أقول شيئا مثل LINES=10000
ولكن في هذه الحالة سيكون هناكالآلاف من أشواط عديمة الفائدة فقط لتحديد ما إذا كنت قد وجدت السطر الأخير من التشغيل السابق.أتساءل عما إذا كان بإمكاني القيام بذلك بشكل أكثر كفاءة إلى حد ما?
المحلول
أعتقد أنك تبحث عن مثل هذا:
#!/bin/bash
GAP=10 #How long to wait
LOGFILE=$1 #File to log to
if [ "$#" -ne "1" ]; then
echo "USAGE: `basename $0` <file with absolute path>"
exit 1
fi
#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."
while :
do
if [ -N $LOGFILE ]; then
echo "`date`: New Entries in $LOGFILE: "
newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
newlines=`expr $newlen - $len`
tail -$newlines $LOGFILE
len=$newlen
fi
sleep $GAP
done
exit 0
لا تنتمي إلى StackOverflow