Bash脚本监视日志,匹配关键字然后发送命令,恢复监视

问题描述 投票:1回答:1
#!/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

我正在尝试编写一个监视日志的脚本,在匹配关键字时,它会触发一些命令。

问题是,我拼凑在一起只能工作一次,然后退出并停止监控。

如果尾部同时出现多个关键字,我希望它在第一个关键字执行,忽略其余关键字,执行列出的脚本,然后返回监控日志尾部。我在grep中添加了“head -1”以在第一次匹配后停止grep,但是这也退出了grep,因此脚本基本停止监视。

我希望脚本在匹配关键字后保持活动状态,并继续监视日志尾部是否有可能记录的新关键字。

任何建议都非常感谢。谢谢!

linux bash logging monitor
1个回答
0
投票

这段代码可以更紧凑,更高效,但这种长形式有助于理解正在发生的事情:

因此,基本的想法是监视/home/main/time.log并检查文件中的行数是否已更改,如果有,那么我们想要找出添加了多少新行,我们将使用此变量来拖尾最后n个文件并对它们执行grep,因为这是运行kill进程所需的条件。

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

附: :请在跑步前进行相关更改。

© www.soinside.com 2019 - 2024. All rights reserved.