Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails -铁路及;cron&;每当/服务器负载过重时延迟几分钟_Ruby On Rails_Ruby_Cron_Whenever - Fatal编程技术网

Ruby on rails -铁路及;cron&;每当/服务器负载过重时延迟几分钟

Ruby on rails -铁路及;cron&;每当/服务器负载过重时延迟几分钟,ruby-on-rails,ruby,cron,whenever,Ruby On Rails,Ruby,Cron,Whenever,我使用一个名为where的gem来管理我的cron作业。 在cronfile中,我每1分钟有一个cron作业,它调用一个任务XXXX。我的config/schedule.rb如下所示: every '* * * * *' do rake "XXXXXXXX" end 此cron作业工作正常,有轻微延迟。进程创建几秒钟后,任务XXXX开始运行其第一行。由于此任务在不到1分钟内完成,因此我不应该同时有多个进程 但是,服务器负载过重,此延迟将变为几分钟。 这导致许多未完成的进

我使用一个名为where的gem来管理我的cron作业。 在cronfile中,我每1分钟有一个cron作业,它调用一个任务XXXX。我的config/schedule.rb如下所示:

every '* * * * *' do
  rake "XXXXXXXX"
end
此cron作业工作正常,有轻微延迟。进程创建几秒钟后,任务XXXX开始运行其第一行。由于此任务在不到1分钟内完成,因此我不应该同时有多个进程

但是,服务器负载过重,此延迟将变为几分钟。
这导致许多未完成的进程保留在我的进程列表中,因为cron作业每分钟都会创建一个进程

这将导致服务器变得更重,如果出现最坏情况,服务器将完全死机


为什么会这样?如何防止cronjob延迟调用任务?

您可以添加一个
相关任务来检查服务器是否正在运行,快速故障(又称早期故障),例如,在调用
rake:test
之前,我想验证我的
rails服务器已在端口
3000
上启动

#Rakefile
任务:检查\u localhost do
pid=系统(“lsof-i tcp:3000-t”)
除非pid#否则失败,或者您可以使用'abort('消息')`
结束
任务:test=>:检查\u localhost do
放入“******这是测试******”
结束

Rake任务并不是每分钟都运行它们,因为每次运行它们时,它们都会加载整个rails环境。您应该改变您的方法,考虑将该逻辑移到后台作业,并对已经运行的rails实例使用该逻辑来触发该作业。谢谢您的评论。“Rake任务不是每分钟都运行一次”这是什么意思?
我每1分钟都有一个cron作业,它调用一个任务XXXX
我同意,听起来问题不在于Ruby gem或crontab。这台机器简直超载了。只需将时间延长到五分钟,就可以消除抖动。如果花费一分钟以上的命令是Rails应用程序中的Rake任务,那么您可能不需要在该Rake任务中加载
:environment
,这可能有助于它更快地运行。如果这些都没有帮助的话,那么我同意你需要某种背景工作系统,比如主动工作。非常感谢。在我的例子中,服务器正在运行,但是负载太重,以至于调用我的rake任务需要几分钟以上的时间。因此,我认为我无法通过另一个任务检测到它。@user16012143如何同步该rake任务,以便如果任务第一次运行并坚持等待繁重的服务,例如5分钟,那么接下来的4个任务(每1分钟发出一次)将等待第一次完成?rake任务如何与rails服务器共享相同的进程?它们始终是两个独立的过程。参考: