我在 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
结束结束