备注:在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
,但现在默认情况下会在支持它的平台上构建和安装这些可加载项。除非您的发行版/ OS做了一些创造性的工作(不幸的是,RHEL / CentOS 8构建bash-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
,则只需要根据需要设置。那不合适,接下来要做的最简单的事情就是从GNU coreutils生成或获取sleep
,这支持必需的功能。 POSIX sleep
命令很少,而较早的Solaris版本仅实现了该命令。 Solaris 11 sleep
确实支持小数秒。作为最后的选择,您可以使用
perl
(或您需要处理的任何其他脚本),但要注意,初始化解释器可能与预期的睡眠时间相当。 :$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
评论
嗯,由于您使用的是Expect,因此您可以直接在脚本中直接使用“ N之后”(N为毫秒)。
–purpur先生
2013年1月15日14:46
使用像@Luis Vazquez和@sebix这样的usleep
– Ilan.K
16-2-20在9:36
Apple MacOS具有BSD睡眠,还支持小数秒
–roblogic
19年8月26日在3:10
#2 楼
来自coreutils的sleep
命令的文档说:睡眠的历史实现要求该数字为
整数,并且仅接受一个不带后缀的参数。 />但是,GNU sleep接受任意浮点数。请参见
浮点。
因此可以使用
sleep 0.1
,sleep 1.0e-1
和类似的参数。评论
查看我关于SOLARIS OS的评论
– Yael
2013年1月15日13:37
你是不是混在一起?
–scai
13年1月15日在13:42
随时查看我的更新
– Yael
2013年1月15日13:45
Yael,我认为您的问题中仍有太多否定因素;您确定您的意思是“非非法语法”吗?
– MadHatter
2013年1月15日14:23
例如-我在solaris 10上运行以下命令:#sleep 0.1 sleep:参数中的错误字符,关于linux sleep 0.1正常
– Yael
2013年1月15日14:37
#3 楼
睡眠接受十进制数,因此您可以将其分解为:1/2秒
sleep 0.5
1/100秒
sleep 0.01
所以一毫秒之内你就会想要
sleep 0.001
评论
您还可以在小数点前删除前导零。例如。睡觉.5
–迈克·凯瑟(Mike Causer)
2014年6月22日7:13
除了mathforum.org/library/drmath/view/52352.html
–斯塔克
17-10-27在13:42
谈论其他人使它过于复杂...
–马丁
18/09/5在7:45
@MikeCauser前导零使代码的可读性更高,并在以后向代码阅读器发出信号意图。实际做数学也更好。
–亚历山大·米尔斯(Alexander Mills)
18/12/22在6:51
#4 楼
尝试使用此方法确定精度: 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)
spuratic先生的解决方案和coles先生的解决方案的组合。
#5 楼
您可以简单地使用usleep
。它需要微秒(= 1e-6秒)作为参数,因此要睡眠1毫秒,您需要输入:usleep 1000
评论
$ usleep未找到命令“ usleep”,您的意思是:从软件包“ coreutils”(主)中命令“ sleep”(主)usleep:未找到命令
–子弹头磁铁
17-4-5在14:18
不,我是说至少在所有Red Hat衍生发行版中都是标准的initscripts软件包的usleep部分;至少包括RHEL,CentOS,Fedora,Mageia / Mandriva和SuSE。这是一个例子:
–路易斯·巴斯克斯(Luis Vazquez)
17年7月15日在17:14
这是在CentOS 7中运行的示例ilustration:`$其中usleep / usr / bin / usleep $ rpm -qf / usr / bin / usleep initscripts-9.49.37-1.el7_3.1.x86_64```总结:-睡眠(来自coreutils)以秒为单位-睡眠(来自initscripts)以微秒为单位
–路易斯·巴斯克斯(Luis Vazquez)
17年7月15日在17:22
#6 楼
我遇到了同样的问题(在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]));避免索引超出数组范围,否则可能导致任何数量的意外行为。
–用户
16-10-13在15:05
@aCVn实际上是(argc == 2){usleep(atoi(argv [1])); } ...
– e2-e4
19-3-25在23:42
另请注意,usleep单位为μs,因此要等待1秒钟,您需要提供1000000参数。
– e2-e4
19 Mar 25 '19在23:45
@RingØ对。愚蠢的错误,好抓住。
–用户
19 Mar 26 '19在7:57
atoi()是将字符串转换为int的可怕选择。 atoi(“ STRING”)返回什么? atoi()无法返回任何错误。
–安德鲁·亨利(Andrew Henle)
19 Mar 26 '19 at 13:18
#7 楼
我喜欢这个沉睡的想法,但是不能在下面发表评论。由于这对我有所帮助,我希望我的建议可以改善这个沉睡的想法。
https:// github .com / fedora-sysv / initscripts / blob / 3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b / src / usleep.c是redhat生态系统上usleep.c的实际源代码。
尝试在Solaris中进行编译。您可能需要https://www.opencsw.org/packages/libpopt0/。
评论
我可以问一下为什么要睡1毫秒吗?是的,当然可以,在我的bash脚本中,我在某些行中添加了“ sleep 1”,但是脚本运行非常缓慢,因此在得出一些结论之后,我计算出sleep 0.1也会带来良好的效果,并且速度更快。关于延迟,我需要按顺序进行延迟为了解决我的bash脚本中的ssh问题,我按期望对某些计算机执行了salal paralel ssh登录,并且没有延迟,它将无法正常工作,如您所知,延迟应该适合Linux和Solaris。
无论选择哪种解决方案,请记住,shell脚本在时间安排上不会很准确。
如何执行需要很短时间才能执行但什么都不做的事情,例如echo“”> / dev / null
好主意,但是此命令需要多少毫秒? ,我需要0.1毫秒,不小于-:)