2011-09-25 52 views
14

我有一個包含一堆任務的應用程序,每天我都想運行一個cron作業,爲數據庫中的每個任務創建一個DayTask。一項任務has_many DayTasks和這些日常任務是用戶每天要檢查的。我使用的是每當寶石,但它似乎並沒有運行。有任何想法嗎?我一直在不斷變化的時代:Cron任務不工作每當gem

配置/ schedule.rb

every 1.day, :at => "12:01am" do 
    runner "Task.generate_tasks_for_day" 
end 

Task.rb

def generate_tasks_for_day 
    Task.all.each do |task| 
     task.day_tasks.create(:target_date => Date.today) 
    end 
    end 

運行 '命令時'

1 0 * * * /bin/bash -l -c 'cd /home/grant/rails_projects/GoalTwist && script/rails runner -e production '\''Task.generate_tasks_for_day'\''' 

注的結果在config/schedule.rb中,每次我想測試運行它。

+0

我可以檢查,當你說「運行的結果,‘每當命令’」你也查了,這是在'crontab中-l'?另外,這是什麼操作系統?我通常會使用UTC運行我的服務器,並確保每當使用本地時區將它們轉換爲UTC時間時。 –

+0

#開始每當生成任務爲:daytask 42 18 * */bin/bash -l -c'cd/home/grant/rails_projects/GoalTwist && script/rails runner -e production'\''Task.generate_tasks_for_day'\ ''' #結束每當生成的任務爲:daytask 我正在運行Linux Mint。並感謝關於時區差異的提醒。 –

回答

60

最後我解決了如何運行gem Whenever。 它在生產上很好,但在開發模式下工作不錯(我認爲要在開發模式下工作良好,你必須做一些技巧)。

然後,這些都是過程要做到:

  1. 安裝寶石
  2. 寫你scheduler.rb文件
  3. 推到遠程服務器
  4. 登錄到遠程服務器(例如用ssh
  5. 看看是否通過運行在終端上傳好:whenever
  6. 更新每當crontab的運行:whenever --update-crontab
  7. 重新啓動(在Ubuntu服務器爲例)的服務器的crontab:sudo service cron restart
  8. 檢查的crontab良好的服務器上實現:crontab -l

這就是它!

就個人而言,我更喜歡直接從服務器設置我crons:

  1. 編輯crontab:crontab -e
  2. 追加我的cron(例如每天上午5:00 - 可以不-基於Linux的服務器略有不同):
    0 5 * * * /bin/bash -l -c 'cd /path_to_my_app/current && RAILS_ENV=production bundle exec rake my_cron_rake'
  3. 檢查好實施:crontab -l
  4. 完成
+2

謝謝!我一開始並不完全明白它的工作原理。我期待更多的魔法;) –

+0

@Zenph我也;) – damoiser

+2

我不明白爲什麼既沒有sidekiq或每當提及'每當--update-crontab' – TalkativeTree

0

嘗試直接從終端執行每當生成的命令或以下行 [email protected] 添加到你的crontab。

+0

我將該行添加到了我的crontab中...沒有電子郵件。 –

+0

當您從rails控制檯調用該方法時,是否會生成dailytasks? 如果是,是否嘗試登錄到生產服務器並執行'/ bin/bash -l -c'cd/home/grant/rails_projects/GoalTwist && script/rails runner -e production'\''Task.generate_tasks_for_day' \''''? – Hugo

3

你有實際登記工作通過運行在crontab:

whenever --update-crontab

此外,如果你想找到工作本地運行,加 :environment => "development"給你的任務

runner "MyTask.some_action", :environment => "development"