sleep是一个非常流行的命令,我们可以从1秒开始睡眠:
# wait one second please
sleep 1
但是如果我只需要等待0.1秒或等待0.1到1秒,该怎么办?
- 备注:在linux或OS X上
sleep 0.XXX
工作正常,但在solarissleep 0.1
或sleep 0.01
-非法语法上
echo "" >/dev/null
sleep是一个非常流行的命令,我们可以从1秒开始睡眠:
# wait one second please
sleep 1
但是如果我只需要等待0.1秒或等待0.1到1秒,该怎么办?
sleep 0.XXX
工作正常,但在solaris sleep 0.1
或sleep 0.01
-非法语法上echo "" >/dev/null
Answers:
Bash具有“可加载”的睡眠,它支持小数秒,并消除了外部命令的开销:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
然后:
$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real 0m1.000s
user 0m0.004s
sys 0m0.004s
缺点是bash
二进制文件可能未提供可加载的内容,因此您需要按照所示的顺序自己编译它们(尽管在Solaris上不一定像上面那样简单)。
截至bash-4.4
(2016年9月),所有可加载项现在默认情况下都已构建并安装在支持它的平台上,尽管它们是作为单独的共享库文件构建的,并且没有.so
后缀。除非您的发行版/ OS做了一些创造性的工作,否则您应该可以做到:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(该手册页暗示BASH_LOADABLES_PATH
是自动设置的,我发现从4.4.12版本开始,官方发行版中就没有这种情况。如果正确设置了它,则只enable -f filename commandname
需要按需设置即可。)
如果不合适,那么下一个最简单的事情就是sleep
从GNU coreutils进行构建或获取,这将支持所需的功能。POSIX sleep
命令是最小的,较早的Solaris版本仅实现了该命令。Solaris 11 sleep
确实支持小数秒。
作为最后的选择,您可以使用perl
(或必须提供的任何其他脚本)警告,初始化解释器可能与预期的睡眠时间相当:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
expect
您可以after N
直接在脚本中直接使用“ ”,其中N为毫秒。
usleep
像@Luis Vazquez和@sebix这样使用
sleep
来自coreutils的命令文档说:
睡眠的历史实现要求该数字为整数,并且仅接受不带后缀的单个参数。但是,GNU sleep接受任意浮点数。请参阅 浮点数。
因此,你可以使用sleep 0.1
,sleep 1.0e-1
而类似的论据。
睡眠接受十进制数字,因此您可以将其分解为:
1/2秒
sleep 0.5
1/100秒
sleep 0.01
所以你想要一毫秒
sleep 0.001
sleep .5
尝试使用此方法来确定准确性:
time sleep 0.5 # 500 milliseconds (1/2 of a second)
time sleep 0.001 # 1 millisecond (1/1000 of a second)
time sleep 1.0 # 1 second (1000 milliseconds)
您可以简单地使用usleep
。它需要微秒(= 1e-6秒)作为参数,因此要睡眠1毫秒,您将输入:
usleep 1000
$ 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
(从启动脚本)用微秒工作
我遇到了同样的问题(在Solaris上没有shell睡眠),因此我这样写了自己的问题:
#include "stdio.h"
int main(int argc, char **argv) {
if(argc == 2) { usleep(atoi(argv[1])); }
return 0;
}
不检查参数-如果您想保留参数,我建议您编写一个正确的参数,但是(gcc usleep.c -o usleep)会让您陷入困境。
usleep()
调用,if(argc == 1) { usleep(atoi(argv[1])); }
以避免在数组范围之外进行索引,否则可能导致许多意外行为。
if (argc == 2) { usleep(atoi(argv[1])); }
...
usleep
单位为μs,因此要等待1秒钟,您需要提供1000000参数。
atoi()
是将字符串转换为的可怕选择int
。是什么atoi( "STRING" )
回报?atoi()
没有办法返回任何错误。
我喜欢这个沉睡的想法,但是我无法对此发表评论。既然这帮助了我,我希望我的建议可以改善不眠的想法。
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c是redhat生态系统上usleep.c的实际源代码。
尝试在Solaris中进行编译。您可能需要https://www.opencsw.org/packages/libpopt0/。