跟踪日志并在消息停止时执行命令

跟踪日志并在消息停止时执行命令

我需要编写一个脚本来跟踪日志并查找特定消息。当消息出现时,脚本需要继续监视日志,当消息5秒没有再次出现时,我需要脚本执行命令。

这是伪代码:

拖尾日志文件发现消息“发生错误” 该消息重复 10 到 20 次。消息停止滚动后,等待 5 秒钟并执行“systemctl restart myservice”

我试图使用 awk,但我无法弄清楚如何等到消息停止滚动后再执行命令。这是我的代码:

tail -F /var/log/mylog.log | awk '
                    /TestString goes here/ { system("sleep 5; systemctl restart myservice") }'

答案1

bash您可以使用、 corutilstimeout和中间文件来完成此操作:

重新启动服务器.bash

# Wait for the initial "TestString"
tail -n0 -F logfile |
while IFS= read -r; do 
  if [[ "$REPLY" == TestString ]]; then 
    break
  fi
done

# See if "TestString" repeats at least every 5 seconds
touch ts
while [ -e ts ]; do
  rm -f ts
  timeout 5 bash -c '
tail -n0 -f logfile |
while IFS= read -r; do 
  if [[ "$REPLY" == TestString ]]; then 
    touch ts
  fi
done
'
done

systemctl restart myserver

格雷格的维基有关 bash while-read 循环的更多信息。

相关内容