Ruby on rails 在生产环境中执行由gem创建的cron时缺少必需的gem

Ruby on rails 在生产环境中执行由gem创建的cron时缺少必需的gem,ruby-on-rails,ruby,cron,rvm,whenever,Ruby On Rails,Ruby,Cron,Rvm,Whenever,我已经在生产中运行了ruby on rails应用程序,这个应用程序有库存型号,应该每1分钟更新一次 为了更新这个模型,我创建了一个简单的rake任务db:populate:stocks,它只包含两个操作: 截断股票模型 使用从webservice获取的最新数据填充股票模型 这个rake任务应该每1分钟执行一次,为此,我在gem时使用。这里是我的日程安排。rb: env :PATH, ENV['PATH'] set :job_template, nil set :output, {:standa

我已经在生产中运行了ruby on rails应用程序,这个应用程序有库存型号,应该每1分钟更新一次

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

  • 截断股票模型
  • 使用从webservice获取的最新数据填充股票模型
  • 这个rake任务应该每1分钟执行一次,为此,我在gem
    时使用。这里是我的日程安排。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
    
    /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>'
    
    在生产中,我使用运行ruby 1.9.2-p180、rails 3.1.0和capistrano的rvm,这里是我的capistrano任务,用于更新cron选项卡:

    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
    
    和myschedule.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

    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
    
    /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>'
    
    /home/admin/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site\u ruby/1.9.1/rubygems.rb:314:在“bin\u路径”中:找不到具有可执行rake的gem rake([“>=0”])(gem::GemNotFoundException)
    from/home/admin/.rvm//gems/ruby-1.9.2-p180@admin/垃圾箱/耙:19:in`'
    

    我缺少的是,为什么cron作业无法加载我的env?我的计划是否有任何问题。rb

    修改路径是不够的,请检查
    rvm help cron
    -在crontab中几乎没有可以帮助管理rvm的选项

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

    我有类似的问题,我用

    rvm cron setup
    
    在服务器中。这会将rvm env变量(路径、GEM_HOME、GEM_PATH…)添加到我的cronjob中

    我必须删除set命令

    env :PATH, ENV['PATH']