У меня есть файл рейка, который можно успешно выполнить в командной строке. Когда я устанавливаю cronjob для запуска этого файла рейка, строка "require" json '"терпит неудачу. Я предполагаю, что cronjob имеет другую переменную env. Это не работает, когда я пытался помещать «ENV» в ruby-скрипт. Поэтому мне интересно, что я должен сделать, чтобы проверить разные переменные env и как решить проблему. Благодарю.Рейк не работает должным образом в cronjob
ответ
у вас есть
require 'rubygems'
в сценарии? Например. irb
загружает rubygems по умолчанию, а нормальный исполнение требует явного импорт.
Да, у меня есть «рубигемы». Если я бегу в командной строке, rake data.rake, не проблема. Ошибка происходит только в cronjob. – swingfuture
Первый: require "json"
, вероятно, не работает, потому что rubygems не загружается. Вероятно, вы можете исправить это, поставив require 'rubygems'
вверху или добавив RUBYOPT=rubygems
в начало командной строки cron или в среду cron (обычно вы можете установить переменные среды в crontab).
Чтобы ответить на вашу проблему с отладкой ENV
: возможно ли, что puts ENV
не работает, поскольку stdout перенаправляется где-то, о чем вы не знаете во время задания cron (он, конечно же, не может попасть на ваш терминал)? Вы можете попробовать следующее вместо:
File.open('/tmp/debug_env', 'w') do |f|
f.puts ENV.to_hash.inspect
end
А потом посмотрим на /tmp/debug_env
, чтобы посмотреть, что там. Переменные среды для особого внимания - $USER
, $GEM_HOME
, $GEM_PATH
, $RUBYOPT
.
Сначала у меня загружены рубигемы, во-вторых, я попробовал ваш совет, добавив RUBYOPT = rubygems к фронту cronjob, та же ошибка. Я попробую отладку ENV. – swingfuture
Возможно, это так, как вы вызываете его в cron. Вот что работает для меня:
cd /full/path/to/rails_root && /full/path/to/rake RAILS_ENV=production my:task
Другим способом сделать это: написать сценарий оболочки для запуска из хрон: первой строки - загрузить файл .profile (или .bash_profile и т.д.) второй линии - запустить скрипт грабель
Вы используете RVM? – cbrulak