我可以让 cron “随机”吗?

war*_*ren 13 cron

也许我完全疯了,如果是这样 - 那很好。但是我将如何安排工作以随机安排广播一条愚蠢的消息,例如 from fortune

澄清
是 - 这是我的个人工作站 - 不打算在生产服务器上做一些不稳定的事情:)

mas*_*mas 13

at如果at已安装,机器正在运行atd并且允许用户使用该命令,则具有用于此类目的的更简单的界面。

例如(使用man at或检查确切的语法info at),

at -f 文件 now + 53 minutes

或者

at -f 文件 now + 2 hours

将分别在 53 分钟或 2 小时内运行指定文件中的命令。

at 然后可以在计划作业开始时使用合适的(随机或其他)开始、计数和时间单位重新运行。

编辑

正如 Arjan 在下面很有帮助地指出的那样,如果您将它用于玩具应用程序以外的其他应用程序,则需要考虑诸如会发生什么的问题

  1. 如果下一次运行在前一次运行完成之前开始(例如脚本是否可重入?)或

  2. 如果运行未能正确完成或

  3. 如果下一次运行完全或无法按时开始(例如,如果在下一次运行即将开始时机器关闭会发生什么)和

  4. 关于失败或成功运行的日志记录和报告。

  • +1,但有几件事需要考虑:如果`at`-命令是第一行,并且脚本运行时间很长(或者间隔很短),那么请注意同时运行多个实例。但是当 `at` 位于脚本的最后一行时,如果脚本失败,显然不会进行重新调度。此外,从命令行运行脚本将使其(重新)调度自身(并且:多个调度可以同时存在)。并且 `cron` 支持通过电子邮件发送任何错误(或:一般输出);我不知道`at` 是否也有类似的东西? (2认同)

And*_*son 13

我在 /etc/crontab 中有很多命令可以做各种各样的事情,有些需要几秒钟的精确度。现在 cron 可以有更精细的分辨率,同时保持所有时间可见和集中。

此示例在每 5 分钟之前的 10 到 50 秒之间获取并解析一个网页:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch
Run Code Online (Sandbox Code Playgroud)

由于数据移动缓慢,它不必有确切的时间,但它有助于通过不必等待网页来尽可能降低 munin 节点的执行时间。(该插件进一步缓存页面 30 分钟以减少不必要的点击,但需要每 5 分钟更新一次数据库)。

注意 \% — cron 用 % 替换了 "\n" — 用于将邮件文本保持在一行上。


Joh*_*n T 7

在内部cron,我认为不存在这样的功能。我认为最好的解决方案是将您的命令放入 shell 脚本中,并sleep在脚本顶部放置一个随机间隔并使用该$RANDOM变量。然后在常规 cron 作业中每天运行一次脚本。

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2
Run Code Online (Sandbox Code Playgroud)

  • sleep() 几乎肯定会被服务提供者杀死。当然,除非他是服务提供者。 (2认同)

A D*_*arf 6

这将取决于您所追求的间隔类型。但让我们假设您希望脚本以 1:30 的概率随机运行(每 30 分钟一次)

  • 为周期构建您的 cron 脚本,例如 10 分钟。它将每 30 分钟发射 3 次。

  • 在脚本中使用rand作为if语句的条件。您希望 rand 返回一个介于 0 和 2 之间的数字。如果它是 0,则执行 if 语句的内容。

本质上,您的脚本总是以设定的时间间隔触发。但只会随机执行您感兴趣的命令。您的服务提供商会感谢您。