【问题标题】:rake task and cron in rails 3 with rvm使用 rvm 在 rails 3 中 rake 任务和 cron
【发布时间】:2012-04-20 14:58:02
【问题描述】:

我正在尝试在 Rails 3.0.9(使用 RVM)中使用 crontab 运行 Rake 任务,但它不起作用。

但是当我在控制台中运行时它工作正常

我的耙子任务

namespace :alert  do
  desc "create some reminder notification"
  task :send_reminder => :environment do
     p "my task goes here ----"
  end
end

我的 cron 任务

*/1 * * * * cd /home/anu-karthik/Documents/billguru/ && /home/anu-karthik/.rvm/gems/ruby-1.9.2-p0/bin/rake  alert:send_reminder >/home/anu-karthik/alert.out

但我没有在“alert.out”文件中找到任何日志条目

我也尝试过以下方法

*/1 * * * * cd /home/anu-karthik/Documents/billguru/ && rake  alert:send_reminder >/home/anu-karthik/alert.out

现在输出是 (在 /home/anu-karthik/Documents/billguru)

我认为这是 RVM 的问题。我该如何解决这个问题? 提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby cron crontab


    【解决方案1】:

    根据 RVM 文档:https://rvm.io/integration/cron

    对于每个 rvm 或 gemset,都有一个描述它的环境文件。您可以通过以下方式获得它:

    rvm env --path -- ruby-version[@gemset-name]
    

    那是rvm环境文件的路径。

    从 cron 运行 rake 任务时,从 shell 脚本调用它们是一个好习惯。

    crontab 应该是这样的:

    */30 * * * * /path/to/shell/script.sh >/dev/null 2>&1
    

    然后在shell脚本中:

    #!/bin/bash
    cd /path/to/project
    source /path/to/env/file
    rake task
    

    希望这会有所帮助!

    【讨论】:

    • 效果很好。 /path/to/project 是从此命令 rvm env --path -- ruby-version[@gemset-name] 生成的,只是为了重申已经说过的内容。
    • 对于像我这样的 unix env 新手。请注意,您的 shell 脚本中需要第一行 #!/bin/bash。
    【解决方案2】:

    尝试使用whenever gem 来管理编写和部署您的 cron 作业。

    默认情况下,所有作业都使用 bash -l -c 'command...' 运行。除其他外,这允许您的 cron 作业通过加载整个环境而不是 cron 有限的环境来与 RVM 配合使用。阅读更多:http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production

    从描述来看应该对你有帮助。

    【讨论】:

    • 我试过下面的,还是不行*/1 * * * * cd /home/anu-karthik/Documents/billguru/ && /home/anu-karthik/.rvm/gems/ruby-1.9.2-p0/bin/rake -l -c alert:send_reminder > /home/anu-karthik/bg4.out 注:我用的是RVM单用户
    • 如果你尝试使用那个 gem 会怎样?
    • 其实我一直在使用when gem。作品在本地找到,但不在生产服务器上执行。这些任务在 cron 中列出并设置为生产环境,但由于一些奇怪的原因,它们一直以退出状态 1 失败。
    【解决方案3】:

    我刚刚为一个项目解决了这个问题:

    来自https://rvm.io/integration/cron/

    "For every installed ruby and created gemset RVM creates wrappers for basic command line tools like gem, rake, ruby. You can find them in `$rvm_path/bin`." 
    

    因此,在上面列出的情况下,您可以执行以下操作:

    */1 * * * * (cd /home/anu-karthik/Documents/billguru/; /usr/local/rvm/bin/rake-ruby-1.9.2-p290@billguru alert:send_reminder)
    

    其中 billguru 将是 gemset,而 ruby​​-1.9.2-p290 将是您正在使用的 ruby​​ 版本。这假设您在 /usr/local/rvm 中安装了系统范围的 rvm。这会在 gemset 的上下文中运行 rake 任务,并为该 gemset 提供适当的 rake。

    上面提到的 rvm.io 页面列出了其他几种执行相同操作的方法,但这个对我来说效果很好。

    【讨论】:

      【解决方案4】:

      你可以只加载(使用)你的 RVM 环境,它会像这样设置 rake 的路径:

      0 * * * * /home/user/.rvm/bin/rvm use ree-1.8.7-2011.03 rake name:task
      

      其中ree-1.8.7-2011.03 是我要加载的gemset 的名称,输入rvm list 以查看您的gemset。

      【讨论】:

        【解决方案5】:

        此脚本将允许您从任何用户/环境运行 Rake 任务。 它将检测 RVM ruby​​ 环境和正确的 Rails 用户。

        #!/bin/bash
        
        RAILS_USER=$(stat -c '%U' /YOUR_PATH_HERE/environment.rb) 
        
        echo "Detected rails user: $RAILS_USER"
        
        sudo -H -u $RAILS_USER bash -c 'RAILS_USER=$USER; echo "I am $USER, with uid $UID" ; echo "whoamI: $(whoami)" ; echo "Running rvm script: /home/$RAILS_USER/.rvm/scripts/rvm" ; source /home/$RAILS_USER/.rvm/scripts/rvm ; ENV_FILE=`rvm env --path` ; echo $ENV_FILE ; source $ENV_FILE ; cd /YOUR_PATH_HERE/lib/tasks ; rake XXX:YYY RAILS_ENV=production'
        

        【讨论】:

          猜你喜欢
          • 2023-04-07
          • 2011-12-03
          • 1970-01-01
          • 2014-05-27
          • 2011-10-06
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          • 2011-04-11
          相关资源
          最近更新 更多