3

需要每天随机运行一次 shell 脚本。(所以每天 00:00-23:59 之间一次)。

我知道sleep命令,也知道cron,但是

  • 没有cron随机时间
  • sleep解决方案 - 不是很好 - 我的想法是在每个午夜启动脚本并在脚本开始时随机休眠。

这里有更优雅的东西吗?

4

5 回答 5

10

如果你有这个at命令,你可以把cron和 结合起来at

每天午夜从 cron 运行下一个脚本:

#!/bin/bash
script="/tmp/script.sh"      #insert the path to your script here
min=$(( 24 * 60 ))
rmin=$(( $RANDOM % $min ))
at -f "$script" now+${rmin}min

以上将在at每个午夜运行命令,并将随机执行您的脚本。atrun您应该检查您的 crontab命令启动的频率。(atrun运行与 一起存储的命令at

与该sleep方法相比的主要好处:这可以“存活”系统重新启动。

于 2013-06-01T14:40:31.707 回答
6

我会简单地在午夜启动你的脚本,sleep随机时间在 0 到 86400 秒之间。由于我的 bash$RANDOM返回一个介于 0 和 32767 之间的数字:

sleep $(( ($RANDOM % 1440)*60 + ($RANDOM % 60) ))
于 2013-06-02T12:40:03.613 回答
5

最好的选择cron可能是at

通常,at从标准输入读取命令,但您可以使用-f.

在时间方面,您可以指定多种格式。也许在你的情况下最方便的是

  • at -f jobs now + xxx minutes

您的脚本将 xxx 作为随机值从1to 1440(一天中的 1440 分钟)提供,并jobs包含您要执行的命令。

于 2013-06-01T14:40:07.470 回答
1

您可以使用 cron 启动 bash 脚本,该脚本会生成伪随机时间戳并将其提供给 unix 程序at

我看到你对 bash 和 cron 足够熟悉,所以at对你来说是小菜一碟。文档一如既往地“人在”,或者您可以尝试 wiki

http://en.wikipedia.org/wiki/At_(Unix)

于 2013-06-01T14:39:44.430 回答
1

没有什么可以阻止您运行 sed 来修补您的 crontab 作为您的程序执行的最后一件事并且只是更改下一次开始时间。虽然我睡不好。

于 2013-06-01T14:41:10.447 回答