Понимание 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/sudoer
s в редких случаях требуется добавить больше переменных - о них следует сообщить при первом запуске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
) запустить ваш код.