2011-05-23 111 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的環境]的