[英]Rufus-scheduler only running once on production
我正在使用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通,因此它知道它應該刷新,並且生產顯示代碼中的更改。 唯一不同的是,沒有警告或錯誤,計划任務不會重復。
救命!
將以下行添加到apache2 config /etc/apache2/apach2.conf並重新啟動Apache服務器
RailsAppSpawnerIdleTime 0
PassengerMinInstances 1
您可能不應該在rails服務器本身中運行rufus-scheduler,尤其是不能使用像passenger這樣的多進程框架。 相反,您應該在守護進程中運行它。
我對正在發生的事情的理論:
Passenger啟動一個ruby服務器進程並使用它來分叉其他服務器來處理請求。 但由於rufus-scheduler在主線程的單獨線程中運行其作業,因此rufus線程僅在原始ruby進程中處於活動狀態(ruby的fork只復制執行分叉的線程)。 這似乎是一件好事,因為它可以阻止多個調度程序運行,但是......乘客可能會在某些條件下殺死ruby進程 - 如果它殺死原始進程,則調度程序線程就會消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.