У меня есть несколько файлов журнала (20-500) от приложения, которое дает сбой. Все файлы журналов относятся к одному запуску приложения - оно сильно многопоточно, и каждый поток записывает в свой собственный файл. Но журналы большие . (В некоторых случаях может составлять 100 МБ каждый)
Теперь один из потоков дает сбой, и когда это происходит, он записывает сообщение в последние сто или около того строк своего файла журнала. Иногда все потоки завершаются нормально, и эта строка никогда не записывается.
Мой сценарий оболочки, запускающий аварийное приложение, находится в bash, и Я хотел бы определить, когда приложение вылетает таким образом, чтобы я мог его перезапустить. Могу ли я сделать что-нибудь лучше, чем:
# We want to run at least once
CRASHED=1
while [ CRASHED -eq 1 ]
# Run the app
run_application
# Check the end of all the logs for KEY
CRASHED=0
for x in logs/* ; do
if tail -n 100 $x | grep "KEY" ; then
CRASHED=1
# We'll only find it once, so may as well bail out now
break
fi
done
done
Меня в первую очередь интересует, могу ли я заменить цикл над файлами журнала чем-то встроенным. Я не могу просто использовать
grep "KEY" logs/*
, поскольку файлы слишком велики, чтобы это было эффективно .
В итоге я воспользовался некоторыми методами из комментариев. Вывод хвоста из основного цикла позволил еще больше упростить логику:
while true
echo "Starting the application"
run_application
echo "Application exited - checking logs for KEY"
if ! tail -qn 100 logs/* | grep -q "KEY"
then
echo "Failed without KEY in the logs - exiting"
break
fi
echo "Failed with KEY in the logs - restarting"
done
Используйте;
tail --follow -n 100 *.log | grep -q key
опустить --follow, если приложение действительно завершает работу при сбое. https://linux.die.net/man/1/tail