Всякий раз, когда задание cron в Rails завершается неудачно с "производственной" базой данных, не настраивается ошибка
В моем приложении Rails я использую всякий раз, когда gem для запуска задачи Sideqik. Когда я запускаю эту команду вручную в консоли rails, она работает. Но всякий раз, когда cron терпит неудачу со следующей ошибкой: он продолжает повторяться в журнале. Как я могу это исправить? В чем проблема?
/home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection': 'production' database is not configured. Available: ["development", "test"] (ActiveRecord::AdapterNotSpecified)
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:211:in `resolve_connection'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:139:in `resolve'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_adapters/connection_specification.rb:169:in `spec'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/connection_handling.rb:50:in `establish_connection'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/railtie.rb:120:in `block (2 levels) in <class:Railtie>'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:28:in `block in on_load'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:27:in `each'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/lazy_load_hooks.rb:27:in `on_load'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activerecord-4.2.0/lib/active_record/railtie.rb:116:in `block in <class:Railtie>'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `instance_exec'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:30:in `run'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:55:in `block in run_initializers'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `call'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/initializable.rb:54:in `run_initializers'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/railties-4.2.0/lib/rails/application.rb:352:in `initialize!'
from /home/pubudu/Projects/istockseller/config/environment.rb:5:in `<top (required)>'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `block in require'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:92:in `preload'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:143:in `serve'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:131:in `block in run'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:125:in `loop'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application.rb:125:in `run'
from /home/pubudu/.rvm/gems/ruby-2.1.5/gems/spring-1.2.0/lib/spring/application/boot.rb:18:in `<top (required)>'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /home/pubudu/.rvm/rubies/ruby-2.1.5/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from -e:1:in `<main>'
1 ответ
Вы сталкиваетесь с этой ошибкой, потому что ваши производственные параметры не настроены правильно для подключения к вашей базе данных. Когда вы запускаете команду из консоли Rails, вы подключаетесь к среде разработки, но ваша задача cron выполняется в производственной среде.
Rails имеет 3 встроенных окружения. Основное отличие состоит в том, что у каждого своя база данных, но есть и другие отличия.
- Производство, когда ваш код работает вживую. Эта среда выполняет много операций кэширования и не отображает сообщения об ошибках разработки для пользователя.
- Разработка, для создания вашего приложения. Это среда по умолчанию и среда, в которой вы проводите большую часть своего времени.
- Тест, для запуска автоматизированных тестов. Основная причина этого в том, что ваш набор тестов может очищать и воссоздавать базу данных при каждом запуске теста. Это делает ваши тесты более воспроизводимыми и предотвращает случайное разрушение БД разработки.
В основном они настраиваются через файлы в config/environments
, Соединения с базой данных настраиваются в config/database.yml
- вы найдете ключи YAML для development
, production
, а также test
там. Руководство по Rails содержит более подробную информацию о настройке приложений.
Вы можете узнать, в какой среде вы работаете через Rails.env
, Например:
user@foo $ rails c
Loading development environment (Rails 4.1.1)
irb(main):001:0> Rails.env
"development"
И вы можете заставить команду работать в данной среде через RAILS_ENV
переменная среды оболочки:
user@foo $ RAILS_ENV=production rails c
Loading production environment (Rails 4.1.1)
irb(main):001:0> Rails.env
"production"
Чтобы решить вашу проблему, у вас есть два варианта:
Заставьте команду cron работать в среде разработки. Похоже, ваше приложение работает в среде разработки (потому что оно работает из консоли, а у вас не настроена производственная база данных). Поэтому принудительное выполнение задания cron в среде разработки должно это исправить. Вы можете установить его в вашем cronjob напрямую, установив
RAILS_ENV
переменная, как мы видели выше, но всякий раз, когда вы можете указать среду в командной строке или в вашемschedule.rb
:set :environment, "development"
Исправьте ваше приложение для запуска в производстве. Если ваше приложение работает, оно действительно должно работать в производственной среде. Это будет быстрее и безопаснее, а также позволит вам все испортить при разработке новых функций без риска уничтожения чего-либо, используемого вашими пользователями. Вам нужно будет настроить базу данных и протестировать ваше приложение в работе. Лучший способ сделать это зависит от платформы; этот вопрос переполнения стека содержит хорошее резюме различных вариантов.