2010-07-13 85 views
3

我有一個rails rake任務,它運行得很好。我想這個任務要定期的crontab所以我加了它的crontab運行如下:ruby​​on rails,rake,crontab和編碼

0,30,0 * * * * cd /var/www/html/metajorn && RAILS_ENV=production /usr/local/bin/rake myraketask --trace >> /var/www/html/metajorn/log/cron_log.log 2>&1 

在cron_log.log我看到了以下錯誤:

rake aborted! 
invalid byte sequence in US-ASCII 
/var/www/html/metajorn/config/boot.rb:98:in `parse_gem_version' 
/var/www/html/metajorn/config/boot.rb:80:in `gem_version' 
/var/www/html/metajorn/config/boot.rb:59:in `load_rails_gem' 
/var/www/html/metajorn/config/boot.rb:54:in `load_initializer' 
/var/www/html/metajorn/config/boot.rb:38:in `run' 
/var/www/html/metajorn/config/boot.rb:11:in `boot!' 
/var/www/html/metajorn/config/boot.rb:110:in `<top (required)>' 
/var/www/html/metajorn/Rakefile:4:in `require' 
/var/www/html/metajorn/Rakefile:4:in `<top (required)>' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2383:in `load' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2383:in  `raw_load_rakefile' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2017:in `block in load_rakefile' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2016:in `load_rakefile' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2000:in `block in run' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/usr/local/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake.rb:1998:in `run' 
/usr/local/bin/rake:31:in `<main>' 

值得注意的是,任務工作正常,如果我手動運行它。

感謝,

中號

回答

3

感謝Carl Smotricz的提示!

我終於解決了這個問題: cron使用的環境變量可能與用戶環境變量不同......我的情況是,我的crond服務使用us-ascii編碼,而我的rake任務使用utf-8。

要解決這個問題,我只是通過添加以下行到我的crond的文件(在我的centos5它在locaed:在/ var /線軸/ cron的/根)來改變的crond的編碼

SHELL=/bin/bash 
LANG=en_US.UTF-8 
LANGUAGE=en 
LC_CTYPE=en_US.UTF-8 
LC_NUMERIC="en_US.UTF-8" 
LC_TIME="en_US.UTF-8" 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY="en_US.UTF-8" 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER="en_US.UTF-8" 
LC_NAME="en_US.UTF-8" 
LC_ADDRESS="en_US.UTF-8" 
LC_TELEPHONE="en_US.UTF-8" 
LC_MEASUREMENT="en_US.UTF-8" 
LC_IDENTIFICATION="en_US.UTF-8" 

比,重新啓動的crond:服務crond的重新啓動

M.

1

我只能猜測,但是請考慮cron提供您的任務僅與環境的最小的子集;如果我沒有記錯的話,只有USERSHELL。從您的用戶帳戶運行一個命令,您可以使用各種值初始化環境 - 使用set來查看!你的PATH通常有很多cron環境中缺少的東西,但還有很多其他的可能性。

最常見的情況是,手動運行和cron運行之間的區別來自環境差異,如上所述。

0

是的,當運行的cron耙某種原因,它在Ruby 1.9字符編碼問題從environment.rb文件加載RAILS_GEM_VERSION時跌倒

#boot.rb 
    def gem_version 
    if defined? RAILS_GEM_VERSION 
     RAILS_GEM_VERSION 
    elsif ENV.include?('RAILS_GEM_VERSION') 
     ENV['RAILS_GEM_VERSION'] 
    else 
     parse_gem_version(read_environment_rb) 
    end 
    end 

約試圖通過在定義RAILS_GEM_VERSION繞過該如何cron rake命令?

RAILS_ENV=production RAILS_GEM_VERSION=2.3.5 /usr/local/bin/rake myraketask