1

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

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

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

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

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

“执行插件:胆小拒绝以root身份执行程序。”

我不确定我还能尝试什么。由 root 以外的用户使用时失败的命令是passenger-status

这是脚本

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

# The name of the collectd plugin, something like apache, memory, mysql, interface, ... PLUGIN_NAME = '乘客状态'

def 用法 puts("#{$0} -h [-i ]") 退出结束

# Main begin # 同步标准输出,以便正确刷新到 collectd。$stdout.sync = 真

# 解析命令行选项 hostname = nil sampling_interval = 20 # sec, Default value opts = GetoptLong.new( [ '--hostid', '-h', GetoptLong::REQUIRED_ARGUMENT ], [ '--sampling-interval', ' -i', GetoptLong::OPTIONAL_ARGUMENT ] ) opts.each 做 |opt, arg| case opt when '--hostid' hostname = arg when '--sampling-interval' sampling_interval = arg.to_i end end use if !hostname

# 收集循环 while true do 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

结束结束

4

1 回答 1

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文件是该文件位于/tmp/passenger.1.0.19198/generation-1/CentOS 5.7 上乘客版本 3.0.9 的目录中。我将文件修改为 644,这解决了这个问题。如果有人想在没有 sudo 的情况下运行乘客状态命令,此解决方案也适用。

于 2012-04-18T18:50:47.863 回答