2014-02-05 4 views
1

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

На сервере:

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) 

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

/current/vendor/bundle/ruby/1.9.1 

Gemfile:

gem 'whenever', require: false 

schedule.rb: Я попытался раскомментировав: окр 'PATH', ENV [ 'PATH'], но путь, который получает положить в файл schedule.rb не помогает. Локально мы используем RVM вместо rbenv (который используется на сервере). Я не уверен, что щурит путь, если мы устанавливаем: окр '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 в сервер и запустить кронтаб -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 

Когда я бегу хрон на сервере Я получаю такой результат:

:/[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>' 

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

+0

Попробуйте запустить хроны сценария задания вручную и посмотреть, если вы получите ту же самую ошибку. – andHapp

+0

Я обновил свой вопрос с результатами запуска скрипта задания cron вручную –

+0

Не могли бы вы предоставить нам содержимое '/ etc/profile.d/rvm.sh'? – Reactormonk

ответ

1

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

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

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

+0

hey Leonid Я обновил свой вопрос с подробностями, отражающими то, что вы просили в своем ответе. Спасибо за ваше время. –

+0

@PavanKatepalli Я имел в виду запустить 'crontab -l' на вашей машине разработки и посмотреть, случайно ли вы установили там cronjob. –

+0

Я запустил его на своей локальной машине в своем приложении rails, и он возвращает: crontab: no crontab для pkatepalli –

1

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

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

  • В вашем сценарии развертывания кажется, что вы делали свой собственный при каждом выполнении задач capistrano. Это неплохо, но whenever уже provides this out of the box с лучшей поддержкой (например, откаты). Вы также можете получить лучшую обратную связь о своих будущих проблемах.

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

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

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