我在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
端 端
答案 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命令,这个解决方案也适用。