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


备注:在linux或OS X上sleep 0.XXX可以正常工作,但在solaris sleep 0.1sleep 0.01上-非法语法


评论

我可以问一下为什么要睡1毫秒吗?

是的,当然可以,在我的bash脚本中,我在某些行中添加了“ sleep 1”,但是脚本运行非常缓慢,因此在得出一些结论之后,我计算出sleep 0.1也会带来良好的效果,并且速度更快。关于延迟,我需要按顺序进行延迟为了解决我的bash脚本中的ssh问题,我按期望对某些计算机执行了salal paralel ssh登录,并且没有延迟,它将无法正常工作,如您所知,延迟应该适合Linux和Solaris。

无论选择哪种解决方案,请记住,shell脚本在时间安排上不会很准确。

如何执行需要很短时间才能执行但什么都不做的事情,例如echo“”> / dev / null

好主意,但是此命令需要多少毫秒? ,我需要0.1毫秒,不小于-:)

#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.1sleep 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/。