2017-02-20 14 views
0

Я пытаюсь реализовать таймер для 5 минут (300 секунд) в миллисекундах, но он занимает более 5 минут для сна 0,001.таймер bash в миллисекундах

Если я меняю 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 

Я хочу тест $x для каждого 0.001secs. df1 и df2 должны выдерживать новые значения за каждые 300 секунд. как я могу это достичь?

+0

Zaheer: Не уверены в ваших полных требованиях, почему бы не поставить сразу 300 (на 5 минут), несмотря на то, что он написал новый код? – RavinderSingh13

+1

Почему бы просто не спать 300? Если вам действительно нужно повторять так быстро (это очень короткий интервал ожидания и, вероятно, объясняет продолжительность дрейфа), вы должны основывать свое сравнение на чтении текущего времени и сравнении с предыдущим временем, а не на спящем предопределенную продолжительность и увеличивая счетчик. Вы можете использовать 'date +% s' для получения счетчика с шагом в секундах на основе системных часов для этой цели. – Fred

+0

Мне нужно отслеживать использование диска за каждый t (0,001) секунд, если есть какая-либо огромная разница ($ x) в течение 300000 секунд, это должно предпринять некоторые действия. Если я использую sleep 300, сценарий будет простаивающим и не будет контролировать df в течение этого периода времени. Я хочу принять быстрые действия, следовательно, 0.001. – Zaheer

ответ

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") 
0

Я уверен, что один сон, как у вас не займет несколько минут. Хотя это может и, в общем, займет больше времени, чем запрошенная вами милисекунда, реальное время сна должно быть значительно ниже одной секунды или, если система загружена, максимум через пару секунд.

Один из недостатков вашего приложения заключается в том, что вы не принимаете во внимание, сколько времени занимает одна итерация вашего цикла. Вы не можете знать это заранее; вы только знаете, что он будет длиннее милисекунды, но не дольше. Следовательно, вы должны закончить цикл по прошествии определенного времени, т. Е. Где-то сохранить время начала и сравнить текущее время с временем начала.

Вторая проблема заключается в том, что вы не устанавливаете где-либо переменные df1 и df2, но, возможно, вы не указали эту деталь, потому что вы не считали ее релевантной для своего вопроса.