AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 469247
Accepted
yael
yael
Asked: 2013-01-16 05:19:53 +0800 CST2013-01-16 05:19:53 +0800 CST 2013-01-16 05:19:53 +0800 CST

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

  • 772

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- 非法语法
linux
  • 8 8 个回答
  • 384088 Views

8 个回答

  • Voted
  1. scai
    2013-01-16T05:22:57+08:002013-01-16T05:22:57+08:00

    来自coreutilssleep命令的文档说:

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

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

    • 165
  2. Best Answer
    mr.spuratic
    2013-01-16T05:52:38+08:002013-01-16T05:52:38+08:00

    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 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根据需要。)

    如果这不合适,那么下一个最简单的事情就是构建或sleep从 GNU coreutils 获取,它支持所需的功能。POSIXsleep命令是最小的,旧的 Solaris 版本只实现了它。Solaris 11sleep 不支持小数秒。

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

    $ perl -e "select(undef,undef,undef,0.1);"
    $ echo "after 100" | tclsh
    
    • 84
  3. colealtdelete
    2013-01-16T05:24:04+08:002013-01-16T05:24:04+08:00

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

    1/2 秒

     sleep 0.5
    

    1/100 秒

    sleep 0.01
    

    所以你会想要一毫秒

    sleep 0.001
    
    • 78
  4. dsrdakota
    2014-06-23T11:52:08+08:002014-06-23T11:52:08+08:00

    试试这个来确定准确性:

        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)
    

    mr.spuratic 的解决方案和coles 的解决方案的组合。

    • 13
  5. Luis Vazquez
    2015-07-09T05:55:16+08:002015-07-09T05:55:16+08:00

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

    usleep 1000
    
    • 13
  6. jrichemont
    2016-05-25T07:12:37+08:002016-05-25T07:12:37+08:00

    我有同样的问题(在 Solaris 上没有 shell usleep)所以我写了自己的:

      #include "stdio.h"
      int main(int argc, char **argv) {
         if(argc == 2) { usleep(atoi(argv[1])); }
         return 0;
    }
    

    不检查参数 - 如果您想保留它,我会推荐一个正确编写的参数,但是 (gcc usleep.c -o usleep) 会让您摆脱困境。

    • 5
  7. edzzz
    2019-07-09T02:23:56+08:002019-07-09T02:23:56+08:00

    我喜欢 usleep 的想法,但我不能在它下面发表评论。由于这对我有所帮助,我希望我的建议可以改善 usleep 的想法。

    https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c是 usleep.c 在 redhat 生态系统中的实际源代码。

    尝试在您的 Solaris 中编译它。您可能需要https://www.opencsw.org/packages/libpopt0/。

    • 0
  8. Daniel Santos
    2022-02-12T13:35:24+08:002022-02-12T13:35:24+08:00

    POSIX 规范sleep只接受整数参数——所以不接受小数秒。GNU 的coreutilssleep添加了对实数、后缀、甚至科学记数法和inf整数的支持作为GNU 扩展。但是如果你在嵌入式系统上使用busybox或只是没有 coreutils,那么除非你有 perl,否则你就不走运了。

    perl -e 'select(undef, undef, undef, 0.1);'
    
    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve