尝试从ruby脚本中运行passenger-status命令时出现权限问题

时间:2012-04-18 00:07:03

标签: ruby centos passenger collectd

我在ruby中写了一个collectd插件,用于检查乘客状态并报告各种指标。当我在一切工作上测试我的脚本时,但当我尝试通过collectd运行我的脚本时,它失败并显示以下消息。

  
    

“错误:您无权查询此Phusion Passenger实例的状态。请使用'sudo'再试一次。”

  

然后我更改了我的ruby脚本以使用sudo命令来导致乘客状态

  
    

“exec plugin:exec_read_one:error = sudo:抱歉,你必须有一个tty来运行sudo”

  

然后我试着让collectd以root身份运行脚本,但是我得到了以下内容

  
    

“exec插件:懦弱地拒绝以root身份执行程序。”

  

我不确定我还能尝试什么。当root用户为passenger-status

的用户使用时失败的命令

这是脚本

  
    

#!/usr/bin/env ruby     要求'getoptlong'

         

# The name of the collectd plugin, something like apache, memory, mysql, interface, ...     PLUGIN_NAME ='passenger-status'

         

def用法       puts(“#{$ 0} -h [-i]”)       出口     端

         

# Main     开始       #Sync stdout以便它将刷新以正确收集。       $ stdout.sync = true

         

#Parse命令行选项       hostname = nil       sampling_interval = 20#sec,默认值       opts = GetoptLong.new(           ['--hosti',' - h',GetoptLong :: REQUIRED_ARGUMENT],           ['--sampling-interval',' - i',GetoptLong :: OPTIONAL_ARGUMENT]       )       opts.each do | opt,arg |         案例选择           什么时候'--hostid'             hostname = arg           什么时候' - 抽样 - 间隔'             sampling_interval = arg.to_i         结束       结束       用法if!hostname

         

#Collection循环       虽然如此         start_run = Time.now.to_i         next_run = start_run + sampling_interval

# collectd data and print the values
data = `passenger-status`
max = data.match(/max (.*)/).to_s.split.last
count = data.match(/count (.*)/).to_s.split.last
active = data.match(/active (.*)/).to_s.split.last
inactive = data.match(/inactive (.*)/).to_s.split.last
waiting = data.match(/Waiting on global queue: ([\d]+)/).to_s.split.last
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-max_allowed_connections #{start_run}:#{max}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-thread_count #{start_run}:#{count}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-threads_active #{start_run}:#{active}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-threads_inactive #{start_run}:#{inactive}")
puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-waiting_in_queue #{start_run}:#{waiting}")

# sleep to make the interval
while((time_left = (next_run - Time.now.to_i)) > 0) do
  sleep(time_left)
end
         

端     端

  

1 个答案:

答案 0 :(得分:0)

查看phusion_passenger/admin_tools/server_instance.rb文件,我能够确定乘客用于确定天气的文件,用户可以运行乘客状态命令。

filename = "#{@generation_path}/passenger-status-password.txt" password = File.open(filename, "rb") do |f| f.read end rescue Errno::EACCES raise RoleDeniedError

它试图读取的文件是passenger-status-password.txt,该文件位于CentOS 5.7上Passenger 3.0.9版的/tmp/passenger.1.0.19198/generation-1/目录中。我将文件chmod到644,这解决了这个问题。如果有人想在没有sudo的情况下运行passenger-status命令,这个解决方案也适用。