【问题标题】:rubyon rails, rake, crontab and encodingruby on rails、rake、crontab 和编码
【发布时间】:2011-03-15 08:34:51
【问题描述】:

我有一个运行良好的 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

【问题讨论】:

    标签: ruby-on-rails ruby cron rake


    【解决方案1】:

    感谢 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.

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        我只能猜测,但请考虑cron 只为您的任务提供了环境的最小子集;如果我没记错的话,仅限于USERSHELL。从您的用户帐户运行命令,您将拥有一个使用各种值初始化的环境 - 使用 set 来看看!你的PATH 经常有很多在 cron 环境中缺失的东西,但还有很多其他的可能性。

        最常见的是,手动运行和 cron 运行之间的差异是由于环境的差异造成的,如前所述。

        【讨论】:

          【解决方案4】:

          是的,由于某种原因,当 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 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-17
            • 1970-01-01
            • 2017-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多