如何在bash中创建具有(重置)功能的计时器
我对shell脚本非常陌生,我在谷歌上搜索了很多关于这个问题的东西。但无法找到一个完美的解决方案 问题是:这是一个带有“错误”模式的日志监控代码 如何在unix脚本中创建计时器。支持我有一个5分钟的计时器,并且时间每1秒不断减少。因此,我想在特定条件下再次将计时器重置为5分钟(假设$FREQUENCY of ERROR occurrence大于ex2)如何在bash中创建具有(重置)功能的计时器,bash,shell,sh,Bash,Shell,Sh,我对shell脚本非常陌生,我在谷歌上搜索了很多关于这个问题的东西。但无法找到一个完美的解决方案 问题是:这是一个带有“错误”模式的日志监控代码 如何在unix脚本中创建计时器。支持我有一个5分钟的计时器,并且时间每1秒不断减少。因此,我想在特定条件下再次将计时器重置为5分钟(假设$FREQUENCY of ERROR occurrence大于ex2) #/usr/bin/env bash 模式class='ERROR' 定时器=300 频率=2 虽然真实; 执行grep-i$PATTERN日志
#/usr/bin/env bash
模式class='ERROR'
定时器=300
频率=2
虽然真实;
执行grep-i$PATTERN日志文件>tmp_日志
而[$TIMER-gt 0]
做
睡眠1&
printf“$TIMER\r”&
计时器=$[$TIMER-1];
等待
完成
如果[[$(wc-l
这对你的案子很有利
这对你的情况很好。当错误频率超过某个值时,你需要重置。对吗?@AshishK是的,你是对的。当它超过某个频率时,你需要重置它吗?重置后,你还需要清除tmp_日志吗?我可以看到这是非常需要的。当错误频率超过某个值时,你需要重置一个特定的值。对吗?@AshishK是的,你是对的。当它超过一定的频率而不是重置它时,你需要在重置后清除tmp_日志吗?正如我所见,这是非常必要的。你也需要在重置后清除tmp_日志吗?正如我所见,这是非常必要的。是的,但我想我会这样做……但是“计时器”和“计时器”不同?不,很抱歉……两者都是相同的……我已经更正了:)你能告诉我具体位置吗???@ashish你处理这个问题的方法效率很低。你应该监视日志文件(例如,使用tail-F
)并逐行处理其输出,而在一个单独的进程中,您将sleep 300
。这两个进程将通过信号(kill
)进行通信,以指示重置或终止。这是一种非常不同的解决方案编程方式,但它将避免轮询并减少计时器漂移(由于执行语句所需的时间,300次迭代所需的时间将超过300秒)。重置后是否还需要清除tmp_日志?正如我所见,这是非常必要的。是的,但我想我会这样做……但是“计时器”和“计时器”不同吗?不,很抱歉……两者都相同……我已更正:)你能告诉我具体在哪里吗???@AshishK你处理这个问题的方法效率很低。你应该监视日志文件(例如,使用tail-F
)并逐行处理它的输出,而在一个单独的进程中,你将sleep 300
。这两个进程将通过信号进行通信(kill
)指示重置或终止。这是一种非常不同的解决方案编程方式,但它可以避免轮询并减少计时器漂移(由于执行语句所需的时间,300次迭代将花费超过300秒的时间)。
#!/usr/bin/env bash
PATTERN='ERROR'
TIMER=300
FREQUENCY=2
while true;
do grep -i $PATTERN logfile > tmp_log
while [ $TIMER -gt 0 ]
do
sleep 1 &
printf " $TIMER \r" &
TIMER=$[$TIMER-1];
wait
done
if [[ $(wc -l <tmp_log) -ge $FREQUENCY ]]
then
TIMER=300
echo $TIMER
fi
sleep $TIMER
done
#!/bin/bash
PATTERN='ERROR'
TIMER=300
FREQUENCY=2
while true
do
while [ $TIMER -gt 0 ]
do
sleep 1
TIMER=$((TIMER - 1))
grep -i $PATTERN logfile > tmp_log
count=`wc -l tmp_log | awk '{ print $1 }'`
if [ $count -gt $FREQUENCY ]
then
TIMER=300
fi
done
break
done