私は、乗客のステータスをチェックし、さまざまな指標を報告することを想定した、Ruby で collectd プラグインを作成しました。すべてでスクリプトをテストすると問題なく動作しますが、collectd を介してスクリプトを実行しようとすると、次のメッセージが表示されて失敗します。
「エラー: この Phusion Passenger インスタンスのステータスを照会する権限がありません。'sudo' で再試行してください。」
次に、Ruby スクリプトを変更して、乗客ステータスに sudo コマンドを使用するようにしました。
「exec プラグイン: exec_read_one: エラー = sudo: 申し訳ありませんが、sudo を実行するには tty が必要です」
次に、collectd でスクリプトをルートとして実行しようとしましたが、次のようになりました。
「exec プラグイン: root としてプログラムを実行することを臆病に拒否しています。」
他に何を試すことができるかわかりません。root 以外のユーザーが使用すると失敗するコマンドpassenger-status
ここにスクリプトがあります
#!/usr/bin/env ruby
「getoptlong」が必要
# The name of the collectd plugin, something like apache, memory, mysql, interface, ...
PLUGIN_NAME = '乗客ステータス'def usage puts("#{$0} -h [-i ]") exit end
# Main
begin # stdout を同期して、collectd に正しくフラッシュされるようにします。$stdout.sync = true# コマンド ライン オプションの解析 hostname = nil sampling_interval = 20 # 秒、デフォルト値 opts = GetoptLong.new( [ '--hostid', '-h', GetoptLong::REQUIRED_ARGUMENT ], [ '--sampling-interval', ' -i', GetoptLong::OPTIONAL_ARGUMENT ] ) opts.each do |opt, arg| case opt when '--hostid' hostname = arg when '--sampling-interval' sampling_interval = arg.to_i end end 使い方 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
終了 終了