如何在 bash 或 ksh 中休眠一毫秒

如何在 bash 或 ksh 中休眠一毫秒

sleep 是一个非常流行的命令,我们可以从 1 秒开始睡眠:

# wait one second please 
sleep 1

但是如果我只需要等待 0.1 秒或 0.1 到 1 秒之间,还有什么其他选择呢?

  • 备注:在 Linux 或 OS X 上sleep 0.XXX工作正常,但在 Solaris 上sleep 0.1或者sleep 0.01- 非法语法

答案1

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。除非您的发行版/操作系统做了一些有创意的事情(遗憾的是 RHEL/CentOS 8bash-4.4带有可加载扩展故意地删除),你应该可以这样做:

[ -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 构建或获取,这支持所需的功能。POSIXsleep命令是最小的,旧的 Solaris 版本只实现了这一点。Solaris 11sleep 支持秒的小数部分。

作为最后的手段,您可以使用perl(或任何其他您必须使用的脚本),但需要注意的是,初始化解释器可能与预期的睡眠时间相当:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

答案2

的文档sleep命令来自核心工具说:

sleep 的历史实现要求数字为整数,并且只接受没有后缀的单个参数。但是,GNU sleep 接受任意浮点数。请参阅 浮点

因此您可以使用sleep 0.1sleep 1.0e-1以及类似的参数。

答案3

Sleep 接受十进制数,因此您可以将其分解如下:

1/2 秒

 sleep 0.5

1/100 秒

sleep 0.01

所以你会想要一毫秒

sleep 0.001

答案4

您可以简单地使用usleep。它以微秒(= 1e-6 秒)作为参数,因此要休眠 1 毫秒,您需要输入:

usleep 1000

相关内容