Вы можете установить выход grep в переменную, а затем оценить, пуст ли он для запуска вашего скрипта/действий.
Пример:
Преобразовать вывод команды в строку с $ (независимо от команды)
line=$( grep -m 1 YourKeyWord <(exec tail -f /directory/of/log.out); kill $! 2> /dev/null)
Затем можно приступать к оценке каждого журнала, и определить следующие действия.
if [ "$line"!="" ]
then
echo "Found $line"
service something start
line=""
echo "Now we can look for ABC"
fi
line=$( grep -m 1 ABC <(exec tail -f /your/otherdir/of/log.out); kill $! 2> /dev/null)
if [ "$linea!="" ]
then
echo "Found the other $linea"
ntpstat (or whatever command you need)
line=""
echo "And we can keep doing this"
fi
Вы можете сделать это с помощью двух функций (один для сброса $ линии, а другой делать Grep, используя вар $ Dir), но ради подробного ответа, давайте оставим этот путь.
Линия,
Grep -m 1 WhateverWord < (EXEC Tail -f /your/otherdir/of/log.out); убить $! 2> /DEV/нуль
был взят из ответа https://superuser.com/questions/275827/how-to-read-one-line-from-tail-f-through-a-pipeline-and-then-terminate со следующим объяснением, и это избежать логических проблем на сервере.
«убить убьют остатки -f процесса хвоста, и скрыть ошибки, потому что вполне возможно, что хвост уже не будет к тому времени убийство будет вызвано.»
http://stackoverflow.com/questions/4331309/shellscript-to-monitor-a-log-file-if-keyword-triggers-then-execute-a-command но вместо 'F' попробовать используя «F» для обработки логарифма вращения – jaroslawj
Я ищу что-то, что может работать непрерывно и может автоматически запускаться с сервера (основанный на cron или init.d) –