Непрерывный мониторинг журналов AIX

У меня есть простое требование: продолжать отслеживать файл журнала и, когда в нем появляется определенный термин, отправлять сообщение JMS. Я использовал приведенный ниже код (checkScript.sh), и он отлично работает до полуночи, когда срабатывает скрипт архивации.

string="requiredstring"
tail -n 0 -f /home/user/log.log | \
while read LINE
do
echo "$LINE" | grep -q $string
java tibjmsProducer -server tcp://localhost:7222 -user admin -password admin -queue test.queue "$LINE"
done

В полночь есть скрипт архивации, который запускает и переименовывает файл log.log в log.log.1 и трогает флай log.log. Таким образом, мы получим два файла log.log и log.log.1. Поскольку AIX не может отслеживать эти изменения файлов с помощью tail, так как хвост в AIX отслеживает только дескриптор файла, я написал еще один сценарий, который перезапустит приведенный выше код после завершения архивирования.

kill -9 `ps -ef|grep "tail -n 0 -f" | grep "checkScript"| awk '{print $2}'`
echo "Killed process. Restarting the shell script"
./checkScript.sh >> /home/user/Service.log 2>&1 &

Интересно, что он работает именно так, как задумано. Но после перезапуска файл журнала перестает отслеживаться, и никакие события не запускаются, но ps -ef в сценарии показывает, что checkScript работает, выполняя хвост.

Что-нибудь я делаю неправильно здесь?

Спасибо!


person aadi    schedule 30.11.2014    source источник


Ответы (2)


Вместо того, чтобы слепо переименовывать, я предлагаю вам cp, а затем cat /dev/null (что сохранит тот же индекс и позволит вашему исходному процессу продолжаться без перерыва). Кроме того, я предлагаю вам использовать команду date. Что-то типа

#!/bin/sh
DT=`date "+%Y%m%d%H%M%S"`
LF="/home/user/log.log"
FN="$LF-$DT"
cp "$LF" "$FN"
cat /dev/null > "$LF"

Наконец, вы можете подумать о добавлении (при условии, что у вас есть bzip2)

bzip2 -9 "$FN"
person Elliott Frisch    schedule 30.11.2014
comment
Извините за путаницу, Эллиотт. Они делают то же самое, копируя все файлы, а затем gzip+tar папку со всеми негабаритными файлами журналов. Чтобы противостоять этой проблеме, я написал скрипт для перезапуска моего файла checkScript и поместил его в crontab. Но что интересно, он не работает должным образом при запуске из cron, но отлично работает, когда я запускаю вручную утром (теряя 8 часов транзакций) - person aadi; 30.11.2014
comment
@aadi Если последним шагом является cat /dev/null > $LF (вместо rm), вам не нужно перезагружать монитор. Дескриптор файла останется постоянным, но существующее содержимое файла будет удалено. - person Elliott Frisch; 30.11.2014
comment
Спасибо, Эллиотт. Они используют > filename.log для сброса файла. Я думаю, что это эквивалентно использованию того, что вы предложили. Я проверю и вернусь к вам. - person aadi; 30.11.2014

Ха! Наконец-то простой (правильный) гугл выдал решение этой дурацкой проблемы. Что я забыл упомянуть, так это (думая, что это не имеет значения), мой скрипт перезапускается с помощью crontab. И cron работает с другим набором переменных среды, который не включает каталог Java. Следовательно, пока скрипт работает, он не передает результаты на сервер JMS.

Чтобы решить эту проблему, я изменил сценарий перезапуска, как показано ниже, и он работал как шарм!

. ${HOME}/.profile
kill -9 `ps -ef|grep "tail -n 0 -f" | grep "checkScript"| awk '{print $2}'`
echo "Killed process. Restarting the shell script"
./checkScript.sh >> /home/user/Service.log 2>&1 &

Это загрузило все правильные и необходимые пути для меня, и теперь скрипт работает нормально. Команда . ${HOME}/.profile помогла решить зависимости в сценарии и теперь будет использовать ее для всех сценариев crontab, которые я буду писать. Спасибо!

person aadi    schedule 01.12.2014
comment
большой плюсик за решение собственной crontab проблемы! Удачи. - person shellter; 05.01.2015