每当GEM错误时使用Rails脚本:__rvm_add_to_path:找不到命令



我正在使用capistrano和gem。

capistrano在我们的ubuntu服务器上部署和更新crontab,并在我们的附表中详细介绍了cronjob。

但是cronjob没有发生。它会失败并每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'],但是将路径放入Schedue.RB文件中无济于事。在本地,我们正在使用RVM而不是RBENV(服务器上使用的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

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

当我进入服务器并在应用程序当前目录中运行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>'

响应Leonid Shevtsov的答案:

我运行:

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时,每当生成crons

时,我会得到

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检查)

好吧,这很复杂,并且缺少一些调试信息,因此我会尝试猜测。

  • 首先,您的系统上似乎同时安装了rvmrbenv,这不是一个好主意。尝试卸载两者之一,或者更好地卸载并重新安装您喜欢的一个。

  • 在您的部署脚本中,您似乎每当Capistrano任务时都滚动了自己的脚步。这还不错,但是whenever已经为此提供了更好的支持(例如回滚)。您还可以对未来问题获得更好的反馈。

这些是潜在的陷阱,但它们可能不是您问题的原因。您似乎已经将有关Linux用户及其权限的事情弄乱了。据我了解,您的生产系统上有两个用户:pkatepalli,另外一个您评论的用户,我们称他为deployer

从我看到的是您试图从deployer的角度设置所有内容,这是一个很好的做法。

  • 我假设Capistrano user变量设置为deployer。如果不是,这是您问题的根源。这是Capistrano用来登录和发出命令的用户。
  • 同样,似乎运行crontab -l时,您可以正确地看到CRON作业,但是如果您在运行命令时使用pkatepalli登录,则这是您的问题。您已经将任务写给了错误的用户的crontab。如果发生这种情况,则更有可能意味着您要么在CAP部署过程中从错误的用户运行whenever命令(在这种情况下,您需要检查哪些是在CAP期间登录的用户),或者实际上您已经从两个用户中运行了whenever命令而且您只会遇到pkatepalli的错误(在再次实验之前清除crontab)。如果看起来还可以,那么您可以尝试将-u username选项传递给whenever命令(您可能需要sudo)。
  • 要正确设置deployer用户,您可以按照capistrano
  • 遵循说明

最新更新