Нужен цикл для сна для части вторых

Я не вижу способ использовать Busybox sed, но Вы могли использовать Busybox sh и grep как это:

while IFS='
' read -r line; do
    printf "%s\n" "$line" | grep -qi '<script' || printf "%s\n" "$line"
done <SOMETHING.html >SOMETHING.html.tmp
mv SOMETHING.html.tmp SOMETHING.html
13
13.10.2012, 00:03
5 ответов

Для преобразования от частей до десятичных чисел в ударе сделайте что-то как

myvar=$(echo "scale=4; 5/10" | bc)

Затем чтобы сделать цикл на том значении,

for i in $(seq 1 1000); do sleep $myvar; done

Моя реализация сна на Debian (GNU), кажется, принимает десятичные значения сна.

К сожалению..

С такой точностью (4-5 десятичных разрядов), Вы собираетесь хотеть что-то как сценарий жемчуга или скомпилированная программа; издержки вызова любой программы в цикле собираются добавить много дрожания. Вызов самого сна возьмет несколько миллисекунд.

Рассмотрите следующее, 1/10,000ths второго сна, сделанного 1000 раз:

time for i in $(seq 1 1000); do sleep 0.0001; done

real    0m2.099s
user    0m3.080s
sys     0m1.464s

Ожидаемый результат был бы 1/10-м из секунды. Сон нигде не имеет около допусков, которые Вы хотите.

https://stackoverflow.com/questions/896904/how-do-i-sleep-for-a-millisecond-in-perl

использование Времени perl:: HiRes, 1000*1000 микросекунд:

my $i=0;
for($i=0;$i<=1000;$i++) {
        usleep(1000);
}

real    0m1.133s
user    0m0.024s
sys     0m0.012s

дает нам намного ближе секунде.

11
27.01.2020, 19:52
  • 1
    , если бы не возможно достигнуть 4-5 десятичных чисел, я взял бы самый лучший результат в качестве альтернативы, но моя точка - то, что я должен выразить это в частях, не десятичных числах или секунды. –  user1717079 13.10.2012, 00:13
  • 2
    Это было бы совершенно тривиально для преобразования части в десятичное число в любом языке сценариев, включая удар. например, эхо "scale=4; 5/10 дюйма | до н.э –  Rob Bos 13.10.2012, 00:18
  • 3
    теперь, я имею, как преобразовать выражение, проблема теперь состоит в том, что простой удар это действительно медленно и не может просто не отставать от этой частоты... –  user1717079 13.10.2012, 00:26
  • 4
    Да, если Вы захотите что-либо намного более точное, чем о 1/10-й из секунды, то Вы, вероятно, захотите жемчуг или Python, чтобы избежать программы, звоня наверху в цикле. –  Rob Bos 13.10.2012, 00:28

Возможно, можно просто работать

sleep 0.7

?

man 1 sleep

на моем archlinux дистрибутив:

Пауза ОПИСАНИЯ в течение секунд ЧИСЛА. СУФФИКС Может быть' в течение многих секунд (значение по умолчанию), 'm' в течение многих минут, 'h' в течение многих часов или 'd' в течение многих дней. В отличие от большинства реализаций, которые требуют, ЧИСЛО является целым числом, здесь ЧИСЛО может быть произвольным числом с плавающей точкой. Учитывая два или больше аргумента, пауза для количества времени указана суммой их значений.

7
27.01.2020, 19:52
  • 1
    sleep позволяет части? можно ли предложить полный пример с поддельным циклом? –  user1717079 12.10.2012, 23:59
  • 2
    0.7 это не часть, которые выражают мою проблему... моя проблема, о гранулярности; думайте о 1/3 и попытайтесь быть точными со сном. –  user1717079 13.10.2012, 00:02

Порождение процесса и загрузки, новый исполняемый файл в нем, вероятно, возьмет несколько миллисекунд, так, чтобы вид точности действительно не имел смысла. Также обратите внимание, что процессорное время во многих системах выделяется процессам частями до 10 мс.

Однако некоторые sleep реализации берут дробные числа секунд, и и zsh и ksh93 могут сделать их $SECONDS специальная переменная, дробная с typeset -F SECONDS.

Пример (zsh):

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000

Ой, это дрейфовало. Можно скорректировать время сна на основе $SECONDS:

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000

Те 2 дополнительных миллисекунды должны, вероятно, считаться к выполнению последнего sleep и date команды.

Также обратите внимание, что zsh имеет a zselect встроенный с тайм-аутом, выраженным за сотую часть секунды. И ksh93 имеет sleep встроенный (и принимает плавающие точки), и printf может распечатать дату/времена.

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685

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

6
27.01.2020, 19:52
  • 1
    sleep 1/70 не позволенный на моей машине... –  user1717079 13.10.2012, 00:07
  • 2
    даже близко к тому, чего я хочу достигнуть, как я могу выполнить вещи быстрее? –  user1717079 13.10.2012, 00:19
  • 3
    Извините, дробным, я не имел в виду выраженный как n/m, где n и m являются целыми числами, но как десятичные числа с дробной частью. Я предполагаю, что Вы могли также назвать их десятичными числами с плавающей точкой, хотя я не уверен в надлежащей английской терминологии –  Stéphane Chazelas 13.10.2012, 00:20
  • 4
    , я думаю, что собираюсь избежать оболочки... –  user1717079 13.10.2012, 00:27
  • 5
    Отвечающая сторона является правильной. Оболочки и процессы обычно не хорошо подходят для разрешения миллисекунды. Для надежной производительности необходимо будет скомпилировать программу, которая называет usleep (3) и т.п. - и Вы, возможно, должны перекомпилировать свое ядро с другой конфигурацией, также; или, по крайней мере, подайте различные параметры к планировщику своего ядра во время выполнения. Это нетривиально, чтобы сделать. Стандартная установка Debian со стандартным ядром ограничила возможности в реальном времени. Однако, Вы могли бы хотеть проверить хорошее (1) команда; это могло бы помочь. –  thb 12.09.2016, 03:43

Если Ваша оболочка sleep не принимает часть, используют жемчуг.

sleep_fraction() {
  /usr/bin/perl -e "select(undef, undef, undef, $1)"
}

sleep_fraction 0.01428

Если необходимо узнать часть, использовать echo "scale=5; 1/70" | bc

3
27.01.2020, 19:52

В Alpine Linux (Busybox) вы можете зацикливать микросекунды с помощью usleep 10 (эквивалент 0,00001 секунды)

GNU sleep поддерживает доли секунды: sleep 0.00001

0
27.01.2020, 19:52

Теги

Похожие вопросы