Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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
Linux bash计时器(毫秒)_Linux_Bash_Shell - Fatal编程技术网

Linux bash计时器(毫秒)

Linux bash计时器(毫秒),linux,bash,shell,Linux,Bash,Shell,我试图实现一个以毫秒为单位的5分钟(300秒)计时器,但是睡眠0.001需要5分钟以上 如果我将[$t-ge 300000]更改为如果[$t-ge 300000],它将在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 ]

我试图实现一个以毫秒为单位的5分钟(300秒)计时器,但是睡眠0.001需要5分钟以上

如果我将[$t-ge 300000]更改为
如果[$t-ge 300000]
,它将在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秒测试一次
$x
df1
df2
应每300秒保存一次新值。我怎样才能做到这一点

日期%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")
start_at=$(日期+%s,%N)
_s1=$(回音$start_在|切-d','-f1)#秒
_s2=$(回声$start_在|切-d','-f2)#纳秒
#在这里做些什么
结束时间=$(日期+%s,%N)
_e1=$(回声$end_在|切-d','-f1处)
_e2=$(回声$end_在|切-d','-f2处)

时间成本=$(bcdate%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")
start_at=$(日期+%s,%N)
_s1=$(回音$start_在|切-d','-f1)#秒
_s2=$(回声$start_在|切-d','-f2)#纳秒
#在这里做些什么
结束时间=$(日期+%s,%N)
_e1=$(回声$end_在|切-d','-f1处)
_e2=$(回声$end_在|切-d','-f2处)

time_cost=$(bc我很确定,像你这样的一次睡眠不会花费几分钟。虽然它可以而且通常会比你要求的毫秒长,但实际睡眠时间应该仍然远低于1秒,或者,如果系统负载很重,最多几秒钟

应用程序中的一个缺陷是,您没有考虑循环的一次迭代需要多长时间。您无法事先知道这一点;您只知道它将超过一毫秒,但不知道需要多长时间。因此,您应该在经过一定时间后结束循环-即,将开始时间存储在某个位置,并比较当前时间从开始时间到结束时间


第二个问题是你不把变量DF1和DF2设置在任何地方,但也许你忽略了这个细节,因为你没有考虑到与你的问题相关的问题。

< P>我很确定,像你这样的一次睡眠不会花费几分钟的时间。eal睡眠时间应该仍然远低于1秒,或者,如果系统负载很重,最多几秒

应用程序中的一个缺陷是,您没有考虑循环的一次迭代需要多长时间。您无法事先知道这一点;您只知道它将超过一毫秒,但不知道需要多长时间。因此,您应该在经过一定时间后结束循环-即,将开始时间存储在某个位置,并比较当前时间从开始时间到结束时间


第二个问题是,你没有设置变量DF1和DF2,但是可能你忽略了这个细节,因为你没有考虑它与你的问题相关。

< P>如果你正在寻找一个显示毫秒的倒计时计时器,你正在寻找这个。 这将计时器显示为百分之一秒

根据需要更改逻辑

    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.

如果你正在寻找一个显示毫秒的倒计时计时器,你正在寻找这个

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

根据需要更改逻辑

    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.

Zaheer:不确定你的全部要求,为什么不直接把sleep 300(5分钟)放在上面,尽管为它编写了一个新的代码?如果你真的需要以如此快的速度迭代(这是一个非常短的睡眠间隔,可能解释了持续时间的漂移),为什么不直接把sleep 300放在上面呢,您应该基于读取当前时间并与上一时间进行比较,而不是休眠预定的持续时间并递增计数器。为此,您可以使用
date+%s
以秒为单位获取递增计数器。我需要监控每个t(0.001)的磁盘使用情况秒,如果在300000秒内有任何巨大的差异($x),它应该采取一些措施。如果我使用sleep 300,脚本将处于空闲状态,并且在这段时间内不会监视df。我希望快速采取措施,因此为0.001。因为循环条件是
[$x-lt 10000]
,如果不知道实际的
df1
df2
值是什么,就很难判断循环何时结束。我能给出的最好建议是
sleep 0.001
可能不太准确。可能值得研究创建一个小C程序来更精确地计算。请参阅本帖的答案Zaheer:不确定您的如果你真的需要以如此快的速度进行迭代(这是一个非常短的睡眠间隔,并且可能解释了持续时间的漂移),那么为什么不直接将sleep 300(5分钟)放在一个新的代码中呢,您应该基于读取当前时间并与上一时间进行比较,而不是休眠预定的持续时间并递增计数器。为此,您可以使用
date+%s
以秒为单位获取递增计数器。我需要监控每个t(0.001)的磁盘使用情况秒,如果在300000秒内有任何巨大的差异($x),它应该采取一些措施。如果我使用sleep 300,脚本将处于空闲状态,并且在这段时间内不会监视df。我希望快速采取措施,因此为0.001。因为循环条件是
[$x-lt 10000]
,如果不知道实际的
df1
df2
值是什么,就很难判断循环何时结束。我能给出的最好建议是
sleep 0.001
可能不太准确。可能值得研究创建一个小C程序来更精确地计算。请参阅本文的答案,根本没有保证
sleep 0.01
只能在给定的时间内睡眠——如果操作系统安排睡眠时间的话,它可以睡更长的时间,并且延迟会在多次/后续调用中累积。我同意。它对我来说工作正常,可以达到百分之一秒。我注意到了