【问题标题】:Bash script to monitor log, match keyword then send commands, resume monitoringBash 脚本监控日志,匹配关键字然后发送命令,恢复监控
【发布时间】:2018-08-28 12:45:57
【问题描述】:
#!/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,因此脚本基本上停止监视。

我希望脚本在匹配关键字后保持活动状态,并继续监视日志尾部以查找可能被记录的任何新关键字。

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

【问题讨论】:

  • 欢迎来到本站!查看tourhow-to-ask page 了解更多关于提出问题以吸引高质量答案的信息。您可以edit your question 包含更多信息。你能给我们举一个你想触发的线路的例子吗?

标签: linux bash logging monitor


【解决方案1】:

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

所以基本的想法是监视/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

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

【讨论】:

  • 您的解决方案看起来很棒,不幸的是我无法让它执行命令。我将路径添加到我的日志中,将关键字添加到 grep,然后在 then 语句之后添加要执行的命令。我通过终端回显命令将匹配的关键字附加到我的日志文件中进行了测试。它确实记录了我通过检查 last.keyfile 验证的日志文件中的文本行,它准确地列出了日志文件中有多少行。不幸的是,它不会执行我添加的命令。你知道我可能做错了什么吗?再次感谢您的宝贵时间和专家建议!
  • @fizers 很遗憾听到它不起作用我会重新检查所有内容并进行编辑
  • @fizers 我已经进行了必要的编辑,问题出在两件事上,一是在 grep 中使用了 `` 斜杠,另一个主要问题是我们在 old_line 变量可以读取之前写入了新的行数,导致差值始终为零。在代码中修复了该问题
  • 感谢您的编辑。您的解决方案运行良好!再次感谢您的时间和天才编码。!!
  • 你最好使用 inotifywait。还有为什么要睡5?你要放掉很多后面出现的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2021-02-14
  • 2018-08-07
  • 1970-01-01
  • 2013-05-02
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多