安排在不同时间执行两次的 cron 作业(AWS Beanstalk)

Posted

技术标签:

【中文标题】安排在不同时间执行两次的 cron 作业(AWS Beanstalk)【英文标题】:schedule cron job executed twice in different time (AWS Beanstalk) 【发布时间】:2017-08-24 08:01:50 【问题描述】:

我使用 AWS Beanstealk php 工作环境。

我在 cron.yaml 中管理我的 cron 作业

version: 1
cron:
 - name: "prepare-technical"
   url: "/workers/cron/event/prepare/technical"
   schedule: "45 0 * * *"

我不明白为什么,但是这个 cron 会在不同的时间执行两次:

127.0.0.1 (-) - - [24/Mar/2017:00:44:59 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [24/Mar/2017:00:52:43 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

127.0.0.1 (-) - - [25/Mar/2017:00:44:59 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [25/Mar/2017:00:49:59 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

127.0.0.1 (-) - - [26/Mar/2017:00:44:59 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [26/Mar/2017:00:53:23 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

127.0.0.1 (-) - - [27/Mar/2017:00:44:59 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [27/Mar/2017:00:50:35 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

127.0.0.1 (-) - - [28/Mar/2017:00:45:00 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [28/Mar/2017:00:50:00 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

127.0.0.1 (-) - - [29/Mar/2017:00:44:59 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [29/Mar/2017:00:50:16 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

127.0.0.1 (-) - - [30/Mar/2017:00:45:00 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"
127.0.0.1 (-) - - [30/Mar/2017:00:50:21 +0000] "POST /workers/cron/event/prepare/technical HTTP/1.1" 200 - "-" "aws-sqsd/2.3"

你知道我该如何解决这个问题吗? 谢谢

【问题讨论】:

【参考方案1】:

默认情况下,如果您的网络服务器在五分钟内没有响应,则会重新发布工作。有几种可能的方法:

1) 增加Configuration/Worker Configuration/Advanced Options下的“Inactivity Timeout”。最大值为 1800(30 分钟)。

2) 通过增加处理能力或将它们拆分成更小的块,让您的作业运行得更快。

3) 收到作业后,在后台线程中执行,并立即从主线程返回。

【讨论】:

感谢您的帮助。我的 cron 非常简单快速(最多执行 45 秒),并在完成时返回一个响应。我该怎么做你的 3) ? 如果您的工作真的那么快,那么将它们放在后台线程中只会增加复杂性而不会解决您的问题。您的工作完成后是否返回200 是的 return new Response(null, 200); 我用我的 200 statut 发送邮件正文时解决了我的问题(在我返回 null 之前)

以上是关于安排在不同时间执行两次的 cron 作业(AWS Beanstalk)的主要内容,如果未能解决你的问题,请参考以下文章

在 aws beanstalk rails 容器上安排 cron 作业

通过 aws opsworks 进行 cron 作业

Laravel 命令在 AWS EC2 上由 Cron 执行时返回不同的输出

确保 cron 作业不会两次执行相同的作业

Cron 作业无法加载 gem

在 Google Cloud DataProc 上安排 cron 作业