【问题标题】:Linux job scheduler launching a script 2 hours after it terminatesLinux 作业调度程序在脚本终止 2 小时后启动脚本
【发布时间】:2014-01-06 17:00:49
【问题描述】:

我有一个运行未知时间段的脚本,这取决于它的输入。数据量少时可以运行1小时,数据量大时可以运行8小时。 我需要定期运行它,尤其是在上一次运行完成后 2 小时。

有没有一个实用程序可以做到这一点?

【问题讨论】:

    标签: linux events scheduler jobs


    【解决方案1】:

    使用 'at' 而不是 'cron' 并在脚本末尾添加:

    at now +2 hours $*
    

    这意味着每次发生都是链式的 - 因此如果它异常终止,则不会安排下一个实例 - 但我认为没有添加大量代码/复杂性的更强大的解决方案。

    【讨论】:

    • 或者让它在完成后触摸文件,并使用 Cron 定期检查文件的年龄。您需要第二个锁定文件来指示工作正在进行中,或者让正在运行的作业在运行时经常接触第一个文件。
    • 所以你说的 rlib 应该要么链接它们,要么添加很多代码/复杂性,三胞胎?
    • 感谢您的回答。是否有一些守护进程运行我的作业,检测到它何时终止,然后等待 2 小时并再次运行作业。当然,我不想增加代码的复杂性,我想要一个现成的解决方案。
    • 取决于作业无法重新启动的严重程度/可能性。对于一个健壮的脚本,我完全赞同你对at 的推荐;这就是为什么这里最终成为评论的原因。
    • 简短回答 - 否 - 但我确实想到您可以将作业实现为守护进程而不是计划的单次运行,然后在控制循环结束时注入 sleep(7200)。当然这前提是你知道如何实现一个守护进程。
    【解决方案2】:

    我不喜欢at提出的解决方案,所以这里有另一个解决方案:

    1. 使用cron 每两小时启动一次

    2. 在启动时,您的应用程序 (*) 会检查是否有 pidfile。

      2.1 如果存在,则可能有另一个实例正在运行:读取文件的内容 (pid) 并查看该 pid 是否是现有进程、僵尸进程或其他进程的 pid。如果它是正在运行的现有进程的 pid,则退出。如果是僵尸进程的pid,那么之前的job就意外结束了,你必须删除pidfile并转到第3步。否则。

    3. 删除 pidfile 后,创建一个新文件并将 pid 放入其中。然后继续做你的工作。

    *:为了不增加复杂性,我引用的这个应用程序也可以是一个简单的包装器,它使用exec 生成您的代码。

    这个解决方案也可以很容易地编写脚本。

    希望对你有帮助,

    史努比BBT

    【讨论】:

    • 我不想在现有代码中添加任何代码。我需要一个外部实用程序。
    【解决方案3】:

    如果看起来很复杂,这里有另一个更脏的解决方案:

    while true ; do
        ./your_application
        sleep 7200
    done
    

    希望这会有所帮助,

    史努比BBT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多