Bash скрипт для мониторинга журнала, сопоставления ключевых слов, затем отправки команд, возобновления мониторинга - PullRequest
0 голосов
/ 28 августа 2018
#!/bin/bash
sudo tail -fn0 /home/main/time.log |
grep -o --line-buffered 'garage\|garden\|porch' | head -1 |
    while read line; do 
sudo pkill -f porch.sh &
sudo pkill -f garage.sh &
done

Я пытаюсь написать скрипт, который следит за журналом, и после сопоставления с ключевым словом он запустит некоторые команды.

Проблема в том, что то, что я собрал, сработает только один раз, затем выйдет и остановит мониторинг.

Если в хвосте появляется несколько ключевых слов одновременно, я хочу, чтобы он выполнялся при первом ключевом слове, игнорировать остальные ключевые слова, выполнить перечисленные сценарии, а затем вернуться к мониторингу хвоста журнала. Я добавил "голову -1" в grep, чтобы остановить grep после первого совпадения, но это также приводит к выходу из grep, поэтому скрипт в основном останавливает мониторинг.

Я бы предпочел, чтобы сценарий оставался активным после того, как он соответствует ключевому слову, и продолжал отслеживать хвост журнала для любых новых ключевых слов, которые могут быть зарегистрированы.

Любой совет очень ценится. Спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Этот код можно сделать немного более компактным и немного более эффективным, но эта длинная форма поможет понять, что происходит:

Таким образом, основная идея состоит в том, чтобы отслеживать /home/main/time.log и проверять, изменилось ли количество строк в файле; если они изменились, то мы хотим выяснить, сколько новых строк было добавлено, мы будем использовать эту переменную для подведения итогов наберите n файлов и выполните grep для них, так как это условие, необходимое для запуска процессов уничтожения.

touch last.keyfile

while true
do 
old_line=$(cat last.keyfile) 
n_lines=$(cat time.log | wc -l);echo $n_lines > last.keyfile 


if [ -z $old_line ];then

    old_line=$(echo "$n_lines")
fi

differ=$((n_lines-old_line))


if [[ $differ > 0 && $(tail -n"$differ" time.log | grep 'abc\|pub' | wc -l) > 0 ]];then   
echo yes

fi
sleep 5
done

P.S. : пожалуйста, внесите соответствующие изменения перед запуском.

...