我可以让 cron 变得“随机”吗?

我可以让 cron 变得“随机”吗?

也许我完全疯了,如果是这样 - 那也没关系。但我该如何安排一项工作以随机的时间表广播一条愚蠢的消息,比如来自fortune

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

答案1

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. 关于失败或成功运行的记录和报告。

答案2

/etc/crontab 中有许多命令用于执行各种操作,有些命令需要精确到秒。现在 cron 可以有更精细的分辨率,同时保持所有时间可见且集中。

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

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

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

请注意 \% — cron 用 % 代替“\n” — 这对于将邮件文本保持在一行上很有用。

答案3

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

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

答案4

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

  • 构建周期为 10 分钟的 cron 脚本。它将每 30 分钟触发 3 次。

  • 在脚本中使用兰特作为条件如果语句。您希望 rand 返回 0 到 2 之间的数字。如果为 0,则执行 if 语句的内容。

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

相关内容