sleep - очень популярная команда, и мы можем начать спать с 1 секунды:
# wait one second please
sleep 1
но какая альтернатива, если мне нужно подождать всего 0,1 секунды или от 0,1 до 1 секунды?
- примечание: на linux или OS X
sleep 0.XXX
работает нормально, а на солярисеsleep 0.1
илиsleep 0.01
- неправильный синтаксис
echo "" >/dev/null
Ответы:
Bash имеет «загружаемый» спящий режим, который поддерживает доли секунды и устраняет накладные расходы внешней команды:
Затем:
Недостатком является то, что загружаемые файлы могут не поставляться с вашим
bash
двоичным файлом, поэтому вам нужно будет скомпилировать их самостоятельно, как показано (хотя в Solaris это не обязательно будет так просто, как указано выше).Начиная с
bash-4.4
(сентябрь 2016 г.) все загружаемые файлы теперь создаются и устанавливаются по умолчанию на платформах, которые его поддерживают, хотя они создаются как отдельные файлы общего объекта и без.so
суффикса. Если ваш дистрибутив / ОС не сделал что-то творческое, вы должны иметь возможность сделать следующее:(Подразумевается, что страница man
BASH_LOADABLES_PATH
устанавливается автоматически, я считаю, что это не так в официальном выпуске с 4.4.12. Если и когда он настроен правильно, вам нужно только то,enable -f filename commandname
что требуется.)Если это не подходит, следующая простейшая вещь - это сборка или получение
sleep
из GNU coreutils, это поддерживает требуемую функцию. Команда POSIXsleep
минимальна, в старых версиях Solaris реализовано только это. Solaris 11sleep
делает поддержку дробных секунд.В качестве последнего средства вы можете использовать
perl
(или любой другой сценарий, который вам придется передать) с оговоркой, что инициализация интерпретатора может быть сопоставима с предполагаемым временем сна:источник
expect
вы можете просто использовать "after N
", где N - миллисекунды, прямо в вашем скрипте.usleep
как @Luis Vazquez и @sebix writeДокументация для
sleep
команды из coreutils гласит:Следовательно , вы можете использовать
sleep 0.1
,sleep 1.0e-1
и подобные аргументы.источник
Сон принимает десятичные числа, чтобы вы могли разбить его следующим образом:
1/2 секунды
1/100 секунды
Так что за миллисекунду вы хотели бы
источник
sleep .5
Попробуйте это, чтобы определить точность:
Сочетание раствора mr.spuratic в и решении Coles игровой .
источник
Вы можете просто использовать
usleep
. Это занимает микросекунды (= 1e-6 секунд) в качестве параметра, поэтому, чтобы спать 1 миллисекунду, вы должны ввести:источник
$ usleep
No command 'usleep' found, did you mean:
Command 'sleep' from package 'coreutils' (main)
usleep: command not found
usleep
частьinitscripts
пакета, которая является стандартной по крайней мере во всех дистрибутивах Red Hat; включая, по крайней мере, RHEL, CentOS, Fedora, Mageia / Mandriva и SuSE. Вот пример: `` ``sleep
(из coreutils ) работает с секундами -usleep
(из initscripts ) работает сУ меня была та же проблема (без оболочки, использующей Solaris), поэтому я написал свою собственную так:
Не проверяет аргументы - я бы порекомендовал правильно написанный, если вы хотите сохранить его, но это (gcc usleep.c -o usleep) выведет вас из дыры.
источник
usleep()
вызов, чтобыif(argc == 1) { usleep(atoi(argv[1])); }
избежать индексации за пределами массива, что может привести к любому неожиданному поведению.if (argc == 2) { usleep(atoi(argv[1])); }
...usleep
единица измерения - мкс, поэтому для ожидания 1 секунды необходимо указать аргумент 1000000.atoi()
это ужасный выбор, чтобы преобразовать строку вint
. Чтоatoi( "STRING" )
возвращает?atoi()
не может вернуть ошибку.Мне нравится идея уснуть, но я не могу комментировать под ней. Так как это помогло мне, я надеюсь, что мое предложение может улучшить идею уснуть.
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c является актуальным исходным кодом для usleep.c в экосистеме redhat.
Попробуйте скомпилировать это в своем Solaris. Вам, вероятно, понадобится https://www.opencsw.org/packages/libpopt0/ .
источник