【问题标题】:Running a cron job randomly for every one hour每隔一小时随机运行一个 cron 作业
【发布时间】:2016-09-29 06:00:12
【问题描述】:

我希望 cronjob 每隔一小时随机运行一次。 (即如果第一个作业在 58 分钟运行,第二个作业应该在 47 分钟运行,第三个在 52 分钟运行,依此类推)但这应该在每个小时内随机运行。有没有办法做到这一点?

【问题讨论】:

  • Cron 本身无法做到这一点。您将不得不求助于解决方法。您可以每分钟运行一个脚本并随机决定它是否应该运行。将每天已经运行的小时数列表保存在一个文件中,并且仅在当前小时数不存在时才运行。
  • 或者从 cron 每小时运行一个脚本,然后在执行任何操作之前等待小于 60 分钟的随机分钟数。或者,从 cron 每小时运行一次,但在 cron 内部,在运行脚本之前随机睡眠不到 60 分钟。
  • 所以0 * * * * perl -e 'sleep int rand 3600' && yourScript 可能。
  • 我能知道 perl -e 在这里做什么吗?
  • perl -e '...' 将单引号中的代码作为 Perl 程序执行。该程序会随机休眠少于 3,600 秒的秒数。当该程序完成休眠时,将调用您的脚本。

标签: linux ubuntu cron


【解决方案1】:

您可以每小时运行一个作业,该作业最多休眠 3,599 秒,然后执行您的脚本:

0 * * * * /path/to/perl -e 'sleep int rand 3600' && /path/to/yourScript

或者,如果您更喜欢Perl,请使用PHP

0 * * * * /path/to/php -r 'sleep(rand(0,3599));' && /path/to/yourScript

您可以通过以下方式找到Perl 的路径:

which perl

PHP 也是如此:

which php

【讨论】:

  • 如果您的环境完全正常,则不需要 Perl 的完整路径,除非您特别想使用自定义安装的版本。我想这在 PHP 中更常见。
  • @triplee 同意!我刚刚看到很多 cron 问题因为缺少路径而失败......
【解决方案2】:

不使用 perl 甚至 php,只需使用内置的 BASH $RANDOM 除以 3600,即等于一小时。

0 * * * * sleep $((RANDOM%3600)) && /path/to/yourScript

请记住,您可能会遇到一些竞争条件,脚本会随机休眠接近一个小时,具体取决于您的脚本执行所需的时间。

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2018-02-18
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多