也许我完全疯了,如果是这样 - 那也没关系。但我该如何安排一项工作以随机的时间表广播一条愚蠢的消息,比如来自fortune
?
澄清
是的 - 这是我的个人工作站 - 不打算在生产服务器上做一些奇怪的事情:)
答案1
at
如果安装了,则具有用于此类目的的更简单的界面at
,机器正在运行atd
并且允许用户使用该命令。
例如(使用man at
或检查确切语法info at
),
at -f
文件now + 53 minutes
或者
at -f
文件now + 2 hours
将分别在 53 分钟或 2 小时内运行指定文件中的命令。
at
然后可以在计划作业开始时以合适的(随机或其他)启动、计数和时间单位重新运行。
编辑
正如 Arjan 在下面指出的那样,如果你将它用于玩具应用程序以外的用途,你需要考虑以下问题:
如果下一次运行在上一次运行完成之前开始(例如脚本是否可重入?)或
如果运行未能正确完成或
如果下一次运行根本无法启动或无法按时启动(例如,如果下一次运行开始时机器关闭,会发生什么情况)以及
关于失败或成功运行的记录和报告。
答案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 语句的内容。
本质上,您的脚本总是按设定的时间间隔触发。但只会随机执行您感兴趣的命令。您的服务提供商会感谢您。