rake任务和cron在rails 3中使用rvm

时间:2012-04-07 08:00:51

标签: ruby-on-rails ruby cron crontab

我正在尝试使用Rails 3.0.9中的crontab运行Rake任务(使用RVM),但它无法正常工作。

但是当我在控制台中运行时它运行良好

我的佣金任务

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的问题。我该如何解决这个问题? 提前致谢

5 个答案:

答案 0 :(得分:11)

根据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

希望这有帮助!

答案 1 :(得分:4)

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

  

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

根据描述来判断它应该对你有帮助。

答案 2 :(得分:2)

我刚刚为一个项目搞清楚了:

来自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页面列出了其他几种执行相同操作的方法,但这个方法对我来说效果很好。

答案 3 :(得分:0)

您可以加载(使用)您的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以查看您的gemsets。

答案 4 :(得分:0)

此脚本允许您从任何用户/环境运行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'