2010-01-17 120 views
16

我目前正在編寫一個應用程序,它從RSS源獲取新的信息,並且必須以特定頻率更新這些RSS源。目前我只在用戶請求提要時拉動,但我想將該行爲更改爲自動定期提取。Ruby On Rails應用程序中的重複性任務:Cron或其他?

我正在編寫一個與數據庫交互的shell腳本,並通過cron定期開始 - 但這是雙重的努力,所以我想知道做什麼是「Rails方式」或「Ruby方式」。我使用的是Ubuntu,Apache和Passenger。你能否提出更好的方法,甚至可能包含在應用程序中,所以我可以輕鬆地將應用程序部署到另一臺機器,而無需與cron混合?

回答

19

我會建議做一些像rake任務,並使用whenever gem生成您的cron作業來運行rake任務。

查看,http://railscasts.com/episodes/164-cron-in-ruby,瞭解更多關於何時寶石的信息。

whenever gem的主要優勢在於它可以保持應用程序內的應用程序需求(即應用程序中每x個小時運行一次cron作業),從而增加應用程序的可移植性。

1

有多種解決方案。對於最簡單的設置,你可以在你的crontab的東西用script/runner像這樣:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname 

METHODNAME必須對模型的靜態方法。您需要以完整路徑引用項目,否則在cron環境中找不到該項目。如果您不熟悉,請查看您的crontab手冊頁以獲取有關crontab語法的信息。例如,上述例子在每天的第0小時的第10分鐘(簡言之,上午12點10分)運行腳本。

如果您需要更強大的解決方案,可以使用BackgroundRB。 BackgroundRB運行守護進程並支持調度的任務,並可將結果放入數據庫中。他們甚至有一個簡單的通信協議,以允許您的Web進程請求任務完成,然後有辦法檢索結果。這使您可以直接從Web界面控制後臺作業,而不是僅僅「發生」的crontab。

BackroundRB工作需要更多的設置,但如果需要控制作業,它可能是值得的。

6

我推薦以上兩者的組合。即使您已經創建了一個直接方法,您也需要一個rake任務。這是因爲服務器管理員想要在cron中運行,您可能還需要偶爾從命令行運行,這是rake任務的優點。

每當插件聽起來很酷,但我不能擔保。當然,知道如何從頭開始做這件事很好,然後使用插件讓你的生活更輕鬆。這是從零開始的方式。

創建一個新的文件,lib/tasks/admin.rake

中,創建任務本身:

namespace :admin 
    desc "Updates all RSS feeds" 
    task :rss => :environment do 
    RssFeed.update_all 
    end 
end 

這裏假設你有一個RSSFeed類和update_all方法做你所期望。您可以從命令行調用這個:

rake admin:rss 

,你可以添加這與cron(通過調用crontab -l作爲Web用戶),並加入這一行:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 
+1

您在瞭解如何手動執行操作時着重點。 正如我在上面指出的那樣,每當gem的主要好處不僅在於編寫cron作業清理器的語法,因爲它使用了dsl,但它允許您保留該業務需求(cron作業),在使用應用程序進行版本控制時,這種方式在需要擴展時,不必通過cron選項卡搜索,複製cron選項卡,篩選與您的應用程序無關的其他cron作業,更改路徑,等等。 你可以用gem生成crontab的附加內容。 – Travis 2010-01-17 19:06:32

+0

我完全同意,我一定會爲自己結賬該寶石!你是對的,期望crons *應該*成爲應用程序的一部分,包含在版本控制中等等。我只是認爲我會貢獻一點基礎。 – 2010-01-17 19:41:06

1

嘗試使用whenever。儘管最終它會創建一個cron,但是調度定義將使用Ruby DSL寫入您的應用程序中。

0

對於小團隊和個人項目,每當寶石很棒時。但是如果你的公司有一個與開發團隊分開的操作團隊,它可能並不理想。

在我上一份工作中,操作團隊需要能夠看到我們正在安裝的cron,因此他們可以確信它不會對系統產生任何副作用。所以DSL解決方案無法工作。但是我們(開發者)想要版本控制中的cron腳本。

因此妥協,我們檢查的文本文件與原始的cron,與此類似:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 

,我們增加了一個步驟是安裝到crontab作爲部署的一部分Capistrano的腳本。

+1

在您的rails應用程序中輸入時,它會輸出cron作業。難道你不能把作業輸出到一個文件供操作團隊看看嗎? – ericraio 2011-12-31 19:54:28

0

嘗試在您的服務器中設置webmin。如果您的託管網站提供它。轉到下面提到的網址。它很容易設置和用戶自由。

網址是:

http://your_ip_address:10000/ 

我已經在我的許多應用中它的工作用這個給我安排cron作業。