Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中创建具有(重置)功能的计时器_Bash_Shell_Sh - Fatal编程技术网

如何在bash中创建具有(重置)功能的计时器

如何在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日志

我对shell脚本非常陌生,我在谷歌上搜索了很多关于这个问题的东西。但无法找到一个完美的解决方案

问题是:这是一个带有“错误”模式的日志监控代码 如何在unix脚本中创建计时器。支持我有一个5分钟的计时器,并且时间每1秒不断减少。因此,我想在特定条件下再次将计时器重置为5分钟(假设$FREQUENCY of ERROR occurrence大于ex2)

#/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