执行生成环境中的gem时创建的cron时缺少必需的gem

时间:2012-09-05 05:17:38

标签: ruby-on-rails ruby cron rvm whenever

我已经在生产中运行的rails应用程序,这个应用程序有 STOCK 模型,它应该每1分钟更新一次。

为了更新这个模型,我创建简单的rake任务 db:populate:stocks ,当它只包含两个操作时:

  1. 截断STOCK模型
  2. 使用来自webservice的最新数据提取来填充STOCK模型
  3. 这个rake任务应该每1分钟执行一次,为此我使用每当gem 。这是我的 schedule.rb

    env :PATH, ENV['PATH']
    set :job_template, nil
    set :output, {:standard => '/home/admin/shared/log/cron.log', :error => '/home/admin/shared/log/cron-error.log'}
    
    job_type :rake, "cd :path && rake :task RAILS_ENV=:environment --trace :output"
    
    every 1.minute do
      rake "db:populate:stocks"
    end
    

    在制作中,我正在使用 rvm 运行ruby 1.9.2-p180,rails 3.1.0和capistrano,这里是我更新cron选项卡的capistrano任务:

    after "deploy:update_code" do
     run "cd #{release_path} && whenever --clear-crontab RAILS_ENV=production"
     run "cd #{release_path} && whenever --update-crontab RAILS_ENV=production"
    end
    

    我的 schedule.rb 创建cron任务,如:

    # Begin Whenever generated tasks for: RAILS_ENV=production
    PATH=/home/admin/.rvm//gems/ruby-1.9.2-p180@admin/bin:/home/admin/.rvm//gems/ruby-1.9.2-p180@global/bin:/home/admin/.rvm//rubies/ruby-1.9.2-p180/bin:/home/admin/.rvm//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    
    * * * * * cd /home/admin/releases/20120904103658 && RAILS_ENV=production rake db:populate:stocks --trace >> /home/admin/shared/log/cron.log 2>> /home/admin/shared/log/cron-error.log
    

    问题是cron任务未能执行rake任务,来自 cron-error.log

    /home/admin/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems.rb:314:in `bin_path': can't find gem rake ([">= 0"]) with executable rake (Gem::GemNotFoundException)
    from /home/admin/.rvm//gems/ruby-1.9.2-p180@admin/bin/rake:19:in `<main>'
    

    我在这里缺少什么,为什么cron作业无法加载我的环境?我的 schedule.rb 有什么问题吗?

3 个答案:

答案 0 :(得分:1)

确保您的RVM默认为宝石所在的正确ruby版本。 然后尝试使用bundle exec rake ... 通过这样做,它将显式调用bundle中的任何gem(假设你正在使用RVM)

答案 1 :(得分:1)

我有类似的问题,我用

修复
rvm cron setup

在服务器中。这将rvm env变量(PATH,GEM_HOME,GEM_PATH ......)添加到我的cronjob中。

我必须删除set命令

env :PATH, ENV['PATH']

答案 2 :(得分:0)

修改PATH是不够的,检查rvm help cron - 有几个选项可以帮助管理crontab中的rvm。