我正在尝试使用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的问题。我该如何解决这个问题? 提前致谢
答案 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'