为了账号安全,请及时绑定邮箱和手机立即绑定

如果任何作业失败,Cron 作业会自动重试

如果任何作业失败,Cron 作业会自动重试

PHP
鸿蒙传说 2022-07-09 10:49:44
我有一个每 5 小时运行一次的 cron 作业。它调用一个PHP脚本,这个脚本会调用一个外部 API 来同步一些数据。问题是有时我会从 API 超时,并且作业会失败。是否有任何机制让 cron 选项卡自动重试或自动恢复失败的作业?我试图做一项额外的工作,并在手动发生任何故障时调用它。这样做的最佳方法是什么?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

Cron 只在特定时间或每分钟/小时/天等运行一次。它不检查返回码。所以这根本不是那么容易的peasy柠檬挤压......

在我看来,你有几个选择如何做到这一点:

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

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

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

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


查看完整回答
反对 回复 2022-07-09
?
千巷猫影

TA贡献1829条经验 获得超7个赞

你可以做的是这样的:

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

1 0-23 13 * *

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

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

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

希望你能明白。


查看完整回答
反对 回复 2022-07-09
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

您可以使用 supervisord :

监督网站

或者在代码中处理 API 超时。


查看完整回答
反对 回复 2022-07-09
  • 3 回答
  • 0 关注
  • 245 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号