2011-09-25 70 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"