bash计时器,以毫秒为单位

时间:2017-02-20 23:56:15

标签: linux bash shell

我试图在毫秒内实现5分钟(300秒)的计时器,但是睡眠时间超过5分钟0.001。

如果我将if [ $t -ge 300000 ]更改为if [ $t -ge 30000 ],则会在3分钟内完成。

df1,df2分别保存时刻t1和t2的磁盘使用值。

t=0
x=0
df1
    while [ $x -lt 10000 ]

        sleep 0.001
        df2
        x=(( df1-df2 ))
        if [ $t -ge 300000 ]
        then
        t=0
        df1            
        else
        (( t++ ))
        fi
    done
dosomething

我希望每0.001秒测试$xdf1df2每300秒应保留一个新值。我该怎么做到这一点?

3 个答案:

答案 0 :(得分:1)

日期%N,将在纳秒内获得时间,也许这有帮助

start_at=$(date +%s,%N)
_s1=$(echo $start_at | cut -d',' -f1)   # sec
_s2=$(echo $start_at | cut -d',' -f2)   # nano sec
# do somethong here
end_at=$(date +%s,%N)
_e1=$(echo $end_at | cut -d',' -f1)
_e2=$(echo $end_at | cut -d',' -f2)
time_cost=$(bc <<< "scale=3; $_e1 - $_s1 + ($_e2 -$_s2)/1000000000")

答案 1 :(得分:1)

我很确定像你这样的单次睡眠不需要几分钟。虽然它可以并且通常需要比您请求的毫秒更长的时间,但真正的睡眠时间应该远低于一秒钟,或者,如果系统负载很重,最多只需几秒钟。

您的应用程序中的一个缺陷是您没有考虑循环的一次迭代需要多长时间。你事先不能知道这件事;你只会知道它会超过一个毫秒,但不会超过多长时间。因此,您应该在经过一段时间后结束循环 - 即将开始时间存储在某处并将当前时间与开始时间进行比较。

第二个问题是你没有设置变量df1和df2的任何地方,但是你可能忽略了这个细节,因为你认为它与你的问题无关。

答案 2 :(得分:0)

如果您正在寻找显示毫秒的倒数计时器,那么您正在寻找。

这将计时器显示为百分之一秒。

根据需要更改逻辑。

    timer() {
    time="`date '+%H:%M:%S' -d "$1"`"
    if [ $# -gt 0 ] && [ "$1" = "$time" ]; then
        echo 
        IFS=:
        set -- $*
        secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} ))
        while [ $secs -ge 0 ]; do
                for msec in {99..0}; do
                printf "\rCountdown Timer: %02d:%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))  $((msec))
                sleep .01
                done
                secs=$(( $secs - 1 ))
        done
        echo
    fi
    echo 
    }

    Usage: # timer HH:MM:SS
    Where: HH  Time in Hours
           MM  Time in Mins
           SS  Time in Secs
    Example: 
           # timer 00:10:00 
           Sets a countdown timer for 10 mins while displaying hundredth of a second.