grep конец нескольких файлов

У меня есть несколько файлов журнала (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/* 

, поскольку файлы слишком велики, чтобы это было эффективно .

0
08.11.2016, 04:46
2 ответа

В итоге я воспользовался некоторыми методами из комментариев. Вывод хвоста из основного цикла позволил еще больше упростить логику:

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 
0
28.01.2020, 04:49

Используйте;

tail --follow -n 100 *.log | grep -q key

опустить --follow, если приложение действительно завершает работу при сбое. https://linux.die.net/man/1/tail

0
28.01.2020, 04:49

Теги

Похожие вопросы