【问题标题】:How to wait for a certain period of time in Perl on Linux如何在 Linux 上的 Perl 中等待一段时间
【发布时间】:2011-03-12 07:37:05
【问题描述】:

我想要一个 Perl 脚本每隔几分钟检查一次特定的 PID,然后终止该进程。我怎么等这几分钟? 谢谢。

【问题讨论】:

    标签: linux perl


    【解决方案1】:

    sleep (n); 其中 n 是您想要休眠的秒数。

    【讨论】:

      【解决方案2】:

      Crontab


      如果您希望 Perl 程序在设定的时间或时间间隔内执行,那么您可能需要考虑 crontab 或其他调度程序。

      Perl


      如果您想在 Perl 脚本中执行等待,您有一些易于部署的选项。

      系统调用

      1. sleep($n) 系统调用,其中 $n 是秒的数值
      2. usleep($n) 系统调用,其中 $n 是一个以微秒为单位的数值

      Perl 模块

      Time::HiRes 提供了许多函数,其中一些函数会覆盖系统调用。部分功能包括:sleep()usleep()nanosleep()alarm()ualarm()

      usleep() 的系统调用不同,与Time::HiRes 打包的系统调用允许休眠一秒钟以上。

      use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep
                          clock_gettime clock_getres clock_nanosleep clock
                          stat );
      

      建议

      您很可能希望分叉您的进程,以便您的主程序可以在该进程在后台休眠时继续工作。

      【讨论】:

      • +1 表示 nanosleep()、第一次 Time::HiRes 答案和睡眠差异
      • 因为是分钟,所以最好不要占用过多的资源,而只需使用调度程序。
      【解决方案3】:

      使用sleep():

      sleep(120);  # sleep for 120 seconds 
      

      对于比一秒更精细的延迟,您可以使用Time::HiRes 模块中的usleep。您也可以使用 Perl 的四参数版本的 select(),不定义前三个参数:

      select(undef, undef, undef, 0.25);  # sleep for 250 milliseconds
      

      【讨论】:

      • usleep 更适合精细控制。 Select 将(并且确实)工作,但它确实应该用于网络。
      • +1。 select 避免了 SIGALRM 混乱,如 perlfunc/sleep 中所述。
      • Time::HiRes 将sleep 重新定义为接受小数秒的一个。
      • @Chris Huang-Leaver:引用 select 的行来自 Perl 文档 (perldoc -f select)。这是官方 Perl 的睡眠时间少于一秒钟的方式。其他花里胡哨的功能在可选的Time::HiRes 模块中实现。
      【解决方案4】:

      您正在寻找sleep($numSeconds);

      所以要等待 2 分钟,您将执行 sleep(120);

      perldoc -f sleep

      【讨论】:

        【解决方案5】:

        如果一秒钟太长,你可以试试usleep(microseconds)sleep(0) 只是让步给操作系统,(丢弃您的进程在调度程序上剩余的时间)。请注意,您要求的所有这些功能都是最少您想要睡眠的时间。在负载较重的系统上,时间可能会稍长一些。

        sleep 和 usleep 是 C 函数,尽管 Perl、python 等具有调用底层 C 函数的函数。 usleep man page, BSD version, (others are available, try Google)

        【讨论】:

        • +1 不知道您为什么投了反对票。 usleep 不是我的首选方法,但它确实有效。
        • @pilcrow,Chris:usleep 在 vanilla Perl 中不可用。并且没有提到 Time::HiRes 这是事实上的标准模块。这就是响应被否决的原因。
        • @Dummy00001,感谢您的澄清。恕我直言,未评论的投票令人沮丧,这剥夺了每个人进行良好讨论和教育的机会。
        • 我的错,没有看到“in Perl”位,或者您是否编辑了问题标题? :-)
        猜你喜欢
        • 2021-05-08
        • 1970-01-01
        相关资源
        最近更新 更多