Linux bash计时器(毫秒)
我试图实现一个以毫秒为单位的5分钟(300秒)计时器,但是睡眠0.001需要5分钟以上 如果我将[$t-ge 300000]更改为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 ]
如果[$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
只能在给定的时间内睡眠——如果操作系统安排睡眠时间的话,它可以睡更长的时间,并且延迟会在多次/后续调用中累积。我同意。它对我来说工作正常,可以达到百分之一秒。我注意到了