我正在使用rufus-scheduler每天从rails服务器运行一个进程。出于测试目的,让我们说每5分钟一次。我的代码如下所示:
在config / initializers / task_scheduler.rb
中scheduler = Rufus::Scheduler::PlainScheduler.start_new
scheduler.every "10m", :first_in => '30s' do
# Do stuff
end
我也尝试过cron格式:
scheduler.cron '50 * * * *' do
# stuff
end
例如,要让流程在每小时50分钟后每小时运行一次。
真气的部分是它在我的本地机器上工作。该过程将定期运行并正常工作。只有在我部署到生产的应用程序上,该过程才会运行一次,而不是重复。
ps faux显示cron正在运行,乘客正在处理rails进程的启动,该站点已被再次ping通,因此它知道它应该刷新,并且生产显示代码中的更改。唯一不同的是,没有警告或错误,计划任务不会重复。帮助!
答案 0 :(得分:3)
您可能不应该在rails服务器本身中运行rufus-scheduler,尤其是不能使用像passenger这样的多进程框架。相反,您应该在守护进程中运行它。
我对正在发生的事情的理论:
Passenger启动一个ruby服务器进程并使用它来分叉其他服务器来处理请求。但由于rufus-scheduler在主线程的单独线程中运行其作业,因此rufus线程仅在原始ruby进程中处于活动状态(ruby的fork只复制执行分叉的线程)。这似乎是一件好事,因为它可以防止多个调度程序运行,但是...... Passenger可能会在某些条件下杀死ruby进程 - 如果它杀死原始进程,则调度程序线程就会消失。
答案 1 :(得分:3)
将以下行添加到apache2 config /etc/apache2/apache2.conf并重新启动apache服务器
RailsAppSpawnerIdleTime 0
PassengerMinInstances 1
答案 2 :(得分:2)