Понимание rubygems 'требуют' в sudo vs rvmsudo

Я использую Ubuntu 12.04.4 TLS

Я написал простой скрипт в /home/abdo/sample_serv.sh который выполняет файл Ruby:

#!/bin/bash
/home/abdo/.rvm/rubies/ruby-2.1.0/bin/ruby /home/abdo/sample_serv.rb

а также /home/abdo/sample_serv.rb содержащий код ниже:

puts $:

require 'sinatra'

set :port, 8084

get '/' do
  %{ <html><body>Hello from Abdo</body></html> }
end

проведение rvmsudo ./home/abdo/sample_serv.sh работает просто отлично но хотелось бы получить sudo ./home/abdo/sample_serv.sh работать, передавая необходимые переменные среды, потому что у меня возникают проблемы с upstart,

Вопрос возникает у меня /etc/init/foo.conf

description "webserver test"

start on runlevel [23]
stop on shutdown

pre-start script
  exec >> /var/log/unicorn_test.log 2>&1
  echo starting
end script

script
  exec >> /var/log/unicorn_test.log 2>&1

  /bin/bash /home/abdo/.rvm/bin/rvmsudo /home/abdo/sample_serv.sh
  echo started
end script

Когда линия /bin/bash /home/abdo/.rvm/bin/rvmsudo /home/abdo/sample_serv.sh достигнуто, я получаю

/home/abdo/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in 
`require': cannot load such file -- sinatra (LoadError)

Я смог получить то же самое ruby -v как у моего пользователя, но это выглядит как GEM_PATH (даже если я установил его в файле конфигурации upstart), это не помогает.

В принципе, если я могу понять, как (и где - gem env не помогает с gem это не команда, когда я делаю sudo) rubygems ищет нужный файл, я должен быть в состоянии двигаться вперед.

1 ответ

Когда вы бежите под sudo вы работаете в другой среде, где gem не установлен, то $PATH отличается, так что вещи не могут идти гладко.

Вы можете попробовать это:

Изменение строгих настроек по умолчанию в sudo

Для смягчения этой ситуации необходимо три вещи:

  • пользователь, который вызывает sudo, должен иметь export rvmsudo_secure_path=0 установить в своей оболочке (например, .bashrc, .bash_profile или.zshrc)
  • закомментируйте Defaults secure_path=... в /etc/sudoers
  • добавлять Defaults env_keep +="rvm_bin_path GEM_HOME IRBRC MY_RUBY_HOME rvm_path rvm_prefix rvm_version GEM_PATH rvmsudo_secure_path RUBY_VERSION rvm_ruby_string rvm_delete_flag" в /etc/sudoers в редких случаях требуется добавить больше переменных - о них следует сообщить при первом запуске rvmsudo,

После этих изменений вы сможете использовать rvmsudo сохранение тех же директив пароля / без пароля, что и для "обычных" вызовов sudo.

редактировать

Если вы не хотите изменять значения по умолчанию, вы можете попытаться синхронизировать значения значений среды, указанных выше (rvm_bin_path GEM_HOME IRBRC MY_RUBY_HOME rvm_path rvm_prefix rvm_version GEM_PATH rvmsudo_secure_path RUBY_VERSION rvm_ruby_string rvm_delete_flag) на ваш root пользователь.

Если это не сработает, вы можете попробовать установить rvm как rootи используя эту среду (вместо /home/abdo/.rvm/bin/rvm) запустить ваш код.

Другие вопросы по тегам