Рубин рельсы, грабли, crontab и кодирование - PullRequest
4 голосов
/ 13 июля 2010

У меня есть задача по рейку, которая отлично работает. Я хочу, чтобы эта задача периодически запускалась 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 голосов
/ 13 июля 2010

Спасибо Карлу Смотричу за подсказку!

Я наконец решил проблему: cron использует переменные окружения, которые могут отличаться от пользовательских переменных окружения ... это был случай, когда мой сервис crond использует насКодировка 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: перезапуск службы crond

M.

2 голосов
/ 16 февраля 2012

Возможно, вы захотите взглянуть на это :) http://www.logikdev.com/2010/02/02/locale-settings-for-your-cron-job/

1 голос
/ 13 июля 2010

Я могу только догадываться, но учтите, что cron предоставляет вашей задаче только минимальное подмножество среды; что-то вроде USER и SHELL только, если я правильно помню. Запустив команду из своей учетной записи, у вас есть среда, инициализированная всеми видами значений - используйте set, чтобы посмотреть! В вашем PATH часто есть много вещей, которых не хватает в среде cron, но есть много других возможностей.

Чаще всего различия между ручным управлением и управлением cron происходят из-за различий в окружающей среде, как описано.

0 голосов
/ 13 июля 2010

Да, по какой-то причине, когда cron запускает rake, он сталкивается с проблемами кодировки символов Ruby 1.9 при загрузке RAILS_GEM_VERSION из environment.rb

#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 
...