【问题标题】:Running a shell script once a day at random time [duplicate]每天随机运行一次shell脚本[重复]
【发布时间】:2013-05-28 05:52:24
【问题描述】:

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

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

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

这里有更优雅的东西吗?

【问题讨论】:

    标签: bash


    【解决方案1】:

    如果您有at 命令,您可以组合cronat

    每个午夜从 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 命令,并将在随机时间执行您的脚本。您应该检查您的 crontab,atrun 命令启动的频率。 (atrun 运行与at 一起存储的命令)

    sleep 方法相比的主要优点:这可以“在”系统重新启动时“存活”。

    【讨论】:

      【解决方案2】:

      cron 的最佳替代品可能是at

      通常,at 从标准输入读取命令,但您可以使用-f 提供作业文件。

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

      • at -f jobs now + xxx minutes

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

      【讨论】:

        【解决方案3】:

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

        sleep $(( ($RANDOM % 1440)*60 + ($RANDOM % 60) ))
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              最近更新 更多