2011-05-23 91 views
0

我试图建立与下面的命令cron作业:计划作业的Rails 3 - 加载系统红宝石不RVM红宝石

crontab -l 


Begin Whenever generated tasks for: myapp 
* * * * * /bin/bash -l -c 'cd /Users/boris/projects/myapp && script/rails runner "Resque.enqueue(MyModel)"' 

我碰到下面的错误;其中我看到它的加载Ruby 1.8。问题是我使用RVM与红宝石1.9.2。我如何在CRON中指定正确的RVM路径?

Subject: Cron <[email protected]> /bin/bash -l -c cd /Users/boris/projects/myapp && script/rails runner "Resque.enqueue(Place)" 
X-Cron-Env: <SHELL=/bin/sh> 
X-Cron-Env: <PATH=/usr/bin:/bin> 
X-Cron-Env: <LOGNAME=boris> 
X-Cron-Env: <USER=boris> 
X-Cron-Env: <HOME=/Users/boris> 
Message-Id: <[email protected]> 
Date: Sun, 22 May 2011 19:24:00 -0700 (PDT) 

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- bundler/setup (LoadError) 
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require' 
from /Users/boris/projects/myapp/config/boot.rb:6 
from script/rails:5:in `require' 
from script/rails:5 

如何在CRON中指定正确的RVM路径?

在此先感谢

与红宝石

红宝石路径:

/Users/boris/.rvm/rubies/ruby-1.9.2-p180/bin/ruby 
+0

可能重复(http://stackoverflow.com/questions/7219400/rvm-isnt-setting-environment-with-cron) – 2011-10-17 00:58:49

回答

0

最简单的解决方案是使用这个命令:

Begin Whenever generated tasks for: myapp 
* * * * * /bin/bash -l -c 'cd /Users/boris/projects/myapp && ./script/rails runner "Resque.enqueue(MyModel)"' 
+0

谢谢,乍一看没有注意到。 – quest 2011-05-23 02:55:30

+0

是的,当它在一个子文件夹中,它不是必要的,只是习惯,因为它是cd \ d文件夹中的脚本/二进制文件需要的= - ) – quest 2011-05-23 03:04:15

1

您的问题是,你执行两个指令但并不像你期望的那样。的两个命令是:

  1. /bin/bash -l -c cd /Users/boris/projects/myapp
  2. script/rails runner "Resque.enqueue(MyModel)"

随着第二仅当第成功执行。我想你只需要一些报价:

* * * * * /bin/bash -l -c 'cd /Users/boris/projects/myapp && script/rails runner "Resque.enqueue(MyModel)"' 

那些单引号会养活你cd ... && script/rails ...配对/bin/bash作为一个单一的指令以及应该改变当前工作目录当执行script/rails你想要什么。

+0

@JZ:当你从正常的工作shell运行它时它工作吗? – 2011-05-23 03:08:20

+0

对我来说,rvm没有通过cron正确加载。 – quest 2011-05-23 04:02:26

+0

@quest:是的,就是这样。闻起来像是一个环境变量问题,所以也许他得到了错误的“红宝石”。更新的错误消息中的路径表明他使用OSX系统ruby而不是他自己的rvm'd(如果他使用rvm)。 – 2011-05-23 05:49:25

3

请不要在cron作业中使用-l开关。 --login开关指示bash作为登录shell运行。因此,它会加载你的环境,而且事情可能似乎有效。但是,cron作业本质上是非交互式的非登录shell。像他们一样鼓励他们只是不好的做法。此外,当bash启动登录shell时,它首先加载系统环境(/ etc/profile),如果在该文件中需要打印到屏幕上(如motd),则cron作业将报告如下的令人讨厌的错误:

的stty:TIOCGETD:用于设备

你并不需要写一个cron亚军没有不适当的ioctl(以下这个逻辑,你不妨写一个cron亚军亚军)。请保持简单。所有你需要做的就是配置你的cron作业来启动一个bash shell,并且让这个bash shell加载你的环境。

在你的脚本不应该直接引用红宝石可执行文件的shebang行,但RVM的红宝石:

#!/usr/bin/env ruby 

这指示脚本加载环境和运行Ruby,我们将与命令行rvm加载。

在许多UNIX派生系统上,crontabs可以在定义要运行的作业的实际行之前具有配置部分。如果是这种情况,您可以指定:

SHELL=/path/to/bash 

这将确保cron作业将从bash派生。不过,您的环境中缺少,因此指示庆典加载你的环境,你将要添加到配置部分如下:

BASH_ENV=/path/to/environment (typically .bash_profile or .bashrc) 

HOME从crontab的所有者的/ etc/passwd文件行自动派生,但你可以覆盖它。

HOME=/path/to/home 

在此之后,cron作业可能是这样的:

15 14 1 * *  $HOME/rvm_script.rb 

,如果你的crontab不支持配置部分是什么。那么,你将不得不把所有的环境指令与作业本身一起放在一行中。例如,

15 14 1 * * export BASH_ENV=/path/to/environment && /full/path/to/bash -c '/full/path/to/rvm_script.rb' 

Full blog post on the subject

[RVM心不是设置与cron的环境]的