【问题标题】:Cron job auto retry if any job get failed如果任何作业失败,Cron 作业会自动重试
【发布时间】:2020-04-19 22:51:16
【问题描述】:

我有一个每 5 小时运行一次的 cron 作业。它调用 PHP 脚本,该脚本将调用外部 API 来同步一些数据。

问题是有时我的 API 超时,作业会失败。

是否有任何机制让 cron 选项卡自动重试或自动恢复失败的作业?

我尝试做额外的工作,并在出现任何故障时手动调用它。

这样做的最佳方法是什么?

【问题讨论】:

标签: php cron


【解决方案1】:

你可以使用supervisord:

supervisord website

或在代码中处理 API 超时。

【讨论】:

    【解决方案2】:

    Cron 仅在特定时间或每分钟/小时/天等运行一次。它不检查返回码。所以榨柠檬汁可不是那么容易的事……

    在我看来,您有几种选择:

    • 创建某种调度程序,如果它失败,您可以在其中再次编写您的 CRON 作业,在这种情况下,您将需要一个更多的 CRON 作业来读取您的调度程序并运行正确的命令。调度程序可以是基于数据库/文件/NoSQL 的。在调度器中,您可以使用(bool) executed 之类的标志,让调度器知道哪些任务已经完成。

    • 失败时使用队列(例如 Rabbit)再次调用它自己。

    • 使用框架,我使用 Symfony 来管理自己创建的命令以基于数据库执行它们(查看下面的第二个链接),还使用 ​​enqueue/enqueue-bundle 包来管理 Symfony 中的队列。

    我认为,如果您对 PHP 不那么先进,我建议您使用 Symfony(查看下面的第二个链接)基于数据库(MySQL / PostgreSQL / NoSQL)的自制调度程序。在这种情况下,您只需 SELECT 数据库中所有未执行的记录(命令)并运行它们。


    讲座

    Laravel - Queues, retrying failed jobs

    Symfony - calling another commands in command

    Queues package for PHP (incl. Symfony)

    enqueue/enqueue-bundle

    【讨论】:

      【解决方案3】:

      你可以这样做:

      https://crontab.guru/#1_0-23_13__

      1 0-23 13 * *
      

      在每个月的 13 日的每小时 1 分钟后开始工作。

      “在第 13 天,从 0 到 23 的每个小时的第 1 分钟。”

      ...然后在您的代码中,您将有一些逻辑来检测进程\脚本是否已经正确运行...如果是,请跳过运行尝试;否则让它运行,然后设置一个标志以检查后续尝试运行。

      希望你能明白。

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 1970-01-01
        • 2019-11-01
        • 2019-07-18
        • 2018-07-08
        • 2019-06-04
        • 2019-10-21
        • 2019-01-18
        • 2014-09-18
        相关资源
        最近更新 更多