0

我正在使用 Ubuntu 12.04.4 TLS

我写了一个简单的 shell 脚本/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当我这样做时不是命令sudorubygems查找所需的文件,我应该能够继续前进。

4

1 回答 1

1

当你sudo在不同的环境下运行时,gem没有安装的地方$PATH不同,所以运行起来可能不顺畅。

你可能想试试这个

更改 sudo 的严格默认值

如果遇到这种情况,需要做 3 件事来缓解这种情况:

  • 调用 sudo 的用户必须export rvmsudo_secure_path=0在他的 shell 环境中设置(想想 .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用户。

如果这不起作用,您可以尝试安装rvmas root,并使用该环境(而不是/home/abdo/.rvm/bin/rvm)来运行您的代码。

于 2014-02-18T20:23:36.563 回答