Сценарий rails, использующий ошибку gem: __rvm_add_to_path: команда не найдена

Я использую капистрано и драгоценный камень всякий раз, когда.

Capistrano развертывает и обновляет crontab на нашем сервере Ubuntu с помощью cronjob, подробно описанного в нашем файле schedule.rb.

Но этого не происходит. Это терпит неудачу и посылает мне каждые 5 минут эту ошибку:

/etc/profile.d/rvm.sh: line 67: __rvm_add_to_path: command not found
/home/pkatepalli/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- bundler/setup (LoadError)
    from /home/pkatepalli/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /[REMOVED]/releases/20140204194143/config/boot.rb:6:in `<top (required)>'
    from /home/pkatepalli/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/pkatepalli/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from script/rails:4:in `<main>'

Странная часть заключается в том, что мы развертываем с другим именем пользователя, чем pkatepalli. pkatepalli - это мое имя пользователя на сервере. Это объясняет, почему он пишет мне об ошибке - я думаю.

Также мы используем ruby ​​1.9.3, а не 1.9.1. Я не уверен, почему он не использует правильную версию ruby.

На сервере:

Bundler version 1.3.5

ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]

$ rbenv version

1.9.3-p448 (set by /[REMOVED]/current/.ruby-version)

Но что интересно, в текущем каталоге есть ruby ​​1.9.1, который меня смущает:

/current/vendor/bundle/ruby/1.9.1 

Gemfile:

gem 'whenever', require: false

schedule.rb: я пытался раскомментировать: env 'PATH', ENV['PATH'], но путь PATH, который помещается в файл schedule.rb, не помогает. Локально мы используем RVM вместо rbenv (который используется на сервере). Я не уверен, что это испортит путь, если мы установим: env 'PATH', ENV ['PATH']

#env 'PATH', ENV['PATH']

#set :output, "/log/cron.log"
#set :stage, :environment_variable

every 5.minutes, :roles => [:app] do
  runner "Model.method"
end

deploy.rb:

require 'capistrano/log_with_awesome'
require "bundler/capistrano"

set :application, "[REMOVED]"

set :scm, :git 

set :repository,  "[REMOVED]"

set :branch, "master"
set :deploy_via, :remote_cache 

set :user, "[REMOVED]"
set :password, "[REMOVED]"
set :deploy_to, "[REMOVED]"

set :keep_releases, 5

task :qa do

    set :domain, "[REMOVED]"
    role :web, "[REMOVED]", {:port => [REMOVED]} # Your HTTP server, Nginx
    role :app, "[REMOVED]", {:port => [REMOVED]} # This may be the same as your `Web` server
    set :env, "test"
end


task :production do

    set :domain, "[REMOVED]"
    role :web, "[REMOVED]", {:port => [REMOVED]} # Your HTTP server, Nginx
    role :app, "[REMOVED]", {:port => [REMOVED]} # This may be the same as your `Web` server
    set :env, "production"
end


set :use_sudo, false
default_run_options[:pty] = true


role :db, "[REMOVED]", {:port => [REMOVED], primary: true, :no_release => true}

after "deploy:setup", "deploy:chown"

namespace :bundle do 

    task :install, {:roles => :app} do
        run "cd #{release_path} && bundle install --deployment --without development test"
    end

end

before "deploy:assets:precompile" do

    transfer :up, "config/application.yml", "#{shared_path}/application.yml", :via => :scp

    run "ln -nfs #{shared_path}/application.yml #{release_path}/config/application.yml"

end

namespace :whenever do
  task :start, :roles => :app do
    run "cd #{release_path} && bundle exec whenever --update-crontab"
  end
end

namespace :deploy do 

    task :execute_migrations, :roles => :app do
        puts "RUNNING DB MIGRATIONS"
        run "cd #{current_path}; bundle exec rake RAILS_ENV=#{env} db:migrate"
    end

    task :chown do
        run "#{try_sudo} chown -R #{user} #{deploy_to}"
    end

    task :restart_nginx, {:roles => :web} do
        run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
    end

    before "deploy:restart_nginx", "deploy:execute_migrations"

    after :deploy, "deploy:restart_nginx"

    after "deploy:restart_nginx", "deploy:cleanup"

    after "deploy:update", "whenever:start"


end

Когда я ssh на сервер и запускаю crontab -l в текущем каталоге приложения:

# Begin Whenever generated tasks for: /[REMOVED]/releases/20140204194143/config/schedule.rb
#0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c 'cd /[REMOVED]/releases/20140204194143 && script/rails runner -e production '\''Model.method'\'''

# End Whenever generated tasks for: [REMOVED]/releases/20140204194143/config/schedule.rb

Когда я запускаю задание cron на сервере, я получаю такой результат:

:/[REMOVED]/current$ rails runner -e production '\''Model.method'\'''
Rails Error: Unable to access log file. Please ensure that /[REMOVED]/releases/20140204194143/log/production.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
/[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands/runner.rb:53:in `eval': (eval):1: syntax error, unexpected $undefined (SyntaxError)
\Model.method'
 ^
(eval):1: unterminated string meets end of file
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands/runner.rb:53:in `<top (required)>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands.rb:64:in `require'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands.rb:64:in `<top (required)>'
    from script/rails:5:in `require'
    from script/rails:5:in `<main>'

Когда я делаю это так Я получаю это:

[REMOVED]/current$ rails runner Model.method
Rails Error: Unable to access log file. Please ensure that [REMOVED]/releases/20140204194143/log/development.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
[REMOVED]/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1208:in `initialize': could not connect to server: Connection refused (PG::ConnectionBad)
    Is the server running on host "localhost" ([REMOVED]) and accepting
    TCP/IP connections on port 5432?
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1208:in `new'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:1208:in `connect'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:326:in `initialize'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `new'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `postgresql_connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:315:in `new_connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:325:in `checkout_new_connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:247:in `block (2 levels) in checkout'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `loop'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `block in checkout'
    from /usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:239:in `checkout'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:102:in `block in connection'
    from /usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:101:in `connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in `retrieve_connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_specification.rb:171:in `retrieve_connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/connection_specification.rb:145:in `connection'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/model_schema.rb:308:in `clear_cache!'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/railtie.rb:97:in `block (2 levels) in <class:Railtie>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:418:in `_run__249672195884464632__prepare__2220886522034318467__callbacks'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:405:in `__run_callback'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:385:in `_run_prepare_callbacks'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:81:in `run_callbacks'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.12/lib/action_dispatch/middleware/reloader.rb:74:in `prepare!'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.12/lib/action_dispatch/middleware/reloader.rb:48:in `prepare!'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/application/finisher.rb:47:in `block in <module:Finisher>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:30:in `instance_exec'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:30:in `run'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:54:in `each'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/initializable.rb:54:in `run_initializers'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/application.rb:136:in `initialize!'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/railtie/configurable.rb:30:in `method_missing'
    from /[REMOVED]/releases/20140204194143/config/environment.rb:5:in `<top (required)>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `block in require'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:236:in `load_dependency'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251:in `require'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/application.rb:103:in `require_environment!'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands/runner.rb:44:in `<top (required)>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands.rb:64:in `require'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands.rb:64:in `<top (required)>'
    from script/rails:5:in `require'
    from script/rails:5:in `<main>'

В ответ на ответ Леонида Шевцова:

Я побежал:

rails runner -e production 'Model.method'

и я получил это:

[REMOVED]/current$ rails runner -e production 'Model.methodName'
/[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands/runner.rb:53:in `eval': undefined method `methodName' for #<Class:0x0000000570d668> (NoMethodError)
    from (eval):1:in `<top (required)>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands/runner.rb:53:in `eval'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands/runner.rb:53:in `<top (required)>'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands.rb:64:in `require'
    from /[REMOVED]/releases/20140204194143/vendor/bundle/ruby/1.9.1/gems/railties-3.2.12/lib/rails/commands.rb:64:in `<top (required)>'
    from script/rails:5:in `require'
    from script/rails:5:in `<main>'

когда я запускаю crontab -l, я получаю когда-либо сгенерированные кроны

2 ответа

a) 1.9.1 является "базовой" версией Ruby 1.9.3 (1.9.3 считается версией Ruby 1.9.1); это нормально, что ты видишь это в путях.

б) командная строка в cron экранирует кавычки; правильный способ проверить это вручную rails runner -e production 'Model.method'

c) вы уверены, что ошибка не приходит из локально установленного задания cron? (проверить с crontab -l)

Хорошо, это довольно сложно, и некоторая отладочная информация отсутствует, поэтому я попытаюсь сделать предположение.

  • Прежде всего кажется, что у вас есть оба rvm а также rbenv установлен в вашей системе, что не очень хорошая идея. Попробуйте удалить один из двух, или еще лучше удалить оба и переустановите тот, который вы предпочитаете.

  • В вашем сценарии развертывания кажется, что вы выполняете свои собственные задачи всякий раз, когда выполняете задачи. Это неплохо, но whenever уже предоставляет это из коробки с лучшей поддержкой (например, откаты). Вы также можете получить лучший отзыв о ваших будущих проблемах.

Это потенциальные ловушки, но они, вероятно, не являются причиной ваших проблем. Вы, кажется, напутали в отношении пользователей Linux и их прав доступа. Насколько я понимаю, в вашей производственной системе есть два пользователя: pkatepalli и еще один, который вы закомментировали, давайте позвонить ему deployer,

Из того, что я вижу, вы пытаетесь настроить все на работу с точки зрения deployer что является хорошей практикой.

  • Я предполагаю, что Capistrano user переменная установлена ​​в deployer, Если нет, то это корень вашей проблемы. Это пользователь, который Capistrano использует для входа и выполнения ваших команд.
  • Также кажется, что при запуске crontab -l вы видите задания cron правильно, но если вы вошли в систему с pkatepalli когда вы запускаете команду, то это ваша проблема. Вы записали свои задачи в crontab не того пользователя. Если это произошло, это скорее всего означает, что вы запускаете whenever команда от неправильного пользователя во время развертывания cap (в этом случае вам нужно проверить, кто вошел в систему во время cap), или вы фактически запустили whenever команда от обоих пользователей, и вы получаете только ошибки для pkatepalli (очистите ваш crontab, прежде чем снова экспериментировать). Если все еще выглядит нормально, вы можете попробовать передать -u username возможность whenever команда (вам, вероятно, нужно sudo за это).
  • Чтобы настроить deployer Пользователь правильно вы можете следовать инструкциям по capistrano
Другие вопросы по тегам