我需要编写一个脚本来跟踪日志并查找特定消息。当消息出现时,脚本需要继续监视日志,当消息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 循环的更多信息。