Ruby on Rails,Rake,Crontab和编码

4

我有一个运行良好的Rails Rake任务。我希望这个任务能够被Crontab周期性地运行,因此我将其添加到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>'

值得注意的是,如果我手动运行任务,则任务正常工作。
谢谢,
M
4个回答

3

感谢 Carl Smotricz 的提示!

我终于解决了这个问题:cron 使用的环境变量可能与用户环境变量不同... 在我的情况下,我的 crond 服务使用 us-ascii 编码,而我的 rake 任务使用 utf-8。

要解决这个问题,我只需要在我的 crond 文件中添加以下行来改变 crond 的编码(在我的 CentOS5 中,它位于 /var/spool/cron/root):

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服务:service crond restart

M.



1
我只能猜测,但请考虑到cron仅为您的任务提供了环境的极小子集; 如果我没记错的话,仅像USERSHELL这样。从您的用户帐户运行命令时,您将获得一个初始化了各种值的环境-使用set查看它!您的PATH通常有很多cron环境中缺少的内容,但还有很多其他可能性。
通常,手动运行和cron运行之间的差异是由上述环境差异导致的。

0

是的,由于某种原因,当cron运行rake时,它在从environment.rb中加载RAILS_GEM_VERSION时会遇到Ruby 1.9字符编码问题。

#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

你可以尝试在 cron rake 命令中定义 RAILS_GEM_VERSION 来绕过这个问题,怎么样?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接