我正在使用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}}寻找文件是必需的,我应该能够继续前进。
答案 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
)来运行您的代码。