1

私は、乗客のステータスをチェックし、さまざまな指標を報告することを想定した、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

終了 終了

4

1 に答える 1

0

このphusion_passenger/admin_tools/server_instance.rbファイルを調べると、ユーザーがpassenger-statusコマンドを実行できるかどうかを判断するために、passengerが使用していたファイルを特定できました。

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 の Passenger バージョン 3.0.9 のディレクトリにあります。ファイルを 644 に chmod すると、問題が修正されました。この解決策は、誰かが sudo なしでパッセンジャー ステータス コマンドを実行したい場合にも適用されます。

于 2012-04-18T18:50:47.863 に答える