[英]Understanding rubygems 'require' in sudo vs rvmsudo
我正在使用Ubuntu 12.04.4 TLS
我在/home/abdo/sample_serv.sh
中編寫了一個簡單的shell腳本,該腳本執行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_PATH
。
基本上,如果我能理解rubygems
(以及在什么地方gem env
沒有幫助,因為當我執行sudo
時gem
不是命令), rubygems
查找所需的文件,因此我應該能夠繼續前進。
當您在sudo
下運行時,您將在未安裝gem
的不同環境中運行,因此$PATH
是不同的,因此可能無法順利運行。
您可能想嘗試一下 :
更改sudo的嚴格默認值
如果遇到這種情況,需要采取三件事來減輕這種情況:
- 調用sudo的用戶必須在其shell環境中設置
export rvmsudo_secure_path=0
(請考慮.bashrc,.bash_profile或.zshrc)- 注釋掉/ etc / sudoers上的
Defaults secure_path=...
- 添加
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 IN罕見的情況下,要求增加更多的變數-他們應該通過的第一次運行報告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
用戶)。
如果這不起作用,則可以嘗試以root
身份安裝rvm
,並使用該環境(而不是/home/abdo/.rvm/bin/rvm
)運行代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.