【发布时间】:2021-08-12 09:45:33
【问题描述】:
我使用一个名为“无论何时”的 gem 来管理我的 cron 作业。 在 cronfile 中,我有每 1 分钟调用一次任务 XXXX 的 cron 作业。我的 config/schedule.rb 是这样的:
every '* * * * *' do
rake "XXXXXXXX"
end
此 cron 作业运行良好,稍有延迟。任务 XXXX 在进程创建几秒钟后开始运行它的第一行。由于这个任务不到 1 分钟就完成了,我不应该同时有多个进程。
但是,服务器负载很重,这个延迟会变成几分钟。
这导致许多未完成的进程保留在我的进程列表中,因为 cron 作业每分钟创建一个进程。
这会导致服务器变重,如果最坏的情况发生,服务器完全死机。
为什么会这样?如何防止 cronjob 延迟调用任务?
【问题讨论】:
-
Rake 任务并不是每分钟都运行它们,因为每次运行它们时,它们都会加载整个 Rails 环境。您应该改变您的方法并考虑将该逻辑移至后台作业并处理该逻辑以触发该作业以用于已经运行的 Rails 实例。
-
感谢您的评论。 “Rake 任务不是每分钟都运行一次”是什么意思?
-
I have every 1 minute cron job which call a task XXXX -
我同意,这听起来不像是 Ruby gem 或 crontab 的问题。机器只是超载了。您可能只需将时间延长至五分钟即可消除颠簸。如果花费超过一分钟的命令是 Rails 应用程序中的 Rake 任务,那么您可能不需要在该 Rake 任务中加载
:environment,这可能有助于它更快地运行。如果这些都没有帮助,那么我同意您需要某种后台作业系统,例如 Active Job。
标签: ruby-on-rails ruby cron whenever