在sudo vs rvmsudo中理解rubygems'required'

时间:2014-02-18 19:38:55

标签: ruby rvm upstart rvmsudo

我正在使用Ubuntu 12.04.4 TLS

我在/home/abdo/sample_serv.sh中编写了一个执行Ruby文件的简单shell脚本:

#!/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}}寻找文件是必需的,我应该能够继续前进。

1 个答案:

答案 0 :(得分:1)

当您在sudo下运行时,您运行的是另一个未安装gem的环境,$PATH不同,因此可能无法顺利运行。

您可以尝试this

  

更改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中   在极少数情况下,需要添加更多变量 - 它们应该是   首次报道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)来运行您的代码。