我可以将cron设为“随机”吗?


12

也许我完全疯了,如果是的话-很好。但是,我该如何安排工作在某个随机时间表上广播一个愚蠢的消息,例如from fortune

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

Answers:


12

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


那是我没有考虑过的方法-如果file包含下一次at运行,可以递归进行,对吗?
沃伦

很棒-刚刚尝试过,效果很好:)
沃伦

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

@Arjan-我不太担心它失败并且不给我发送电子邮件..因为(在这一点上)我只是用它来在我的工作站上玩耍:) ..但是-这要考虑的问题如果将其扩展为对入侵的随机检查
沃伦

我正在设想的脚本将不在乎一次运行多少个自身副本
沃伦

13

我在/ etc / crontab中有很多命令可以执行各种操作,有些命令需要几秒钟的精度。现在,cron可以具有更好的分辨率,同时保持所有时间可见并集中。

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

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

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

请注意,\%-cron用%代替“ \ n”-用于将邮件文本保持在一行上。


如果您要缓存网页,则不一定会获得准确的加载结果
Warren

1
是的,我知道-“数据移动缓慢”-该插件从某个网站获取货币汇率,但我不想被禁止。(我不是商人,但我花了很多时间来观看穆宁图)我为当地天气制作了一个类似的插件。应用无止境!
安迪·李·罗宾逊

1
啊哈!..非常酷的方法:)
沃伦

6

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

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

1
sleep()几乎可以保证它将被服务提供者杀死。当然,除非他是服务提供商。
2009年

1
我假设这是在他自己的Linux机器上,或者如果他向某人随机发财,则该在某台机器上
John T

好吧,那是真的。
矮人

为什么睡觉是个坏主意?只是问...
Tadeusz A.Kadłubowski09年

澄清了@John T的问题
沃伦

6

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

  • 构建您的cron脚本大约需要10分钟。每30分钟将触发3次。

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

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


@A矮人-同样也感谢您的想法-如果我想在某些频繁但准随机的基础上检查入侵等情况,这将是一条稍微有用的方法
沃伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.