Я написал плагин collectd на ruby, который должен проверять статус пассажиров и сообщать различные показатели. Когда я тестирую свой скрипт на сервере, все работает хорошо, но когда я пытаюсь запустить свой скрипт через collectd, он завершается со следующим сообщением.
«ОШИБКА: у вас нет прав на запрос статуса этого экземпляра Phusion Passenger. Повторите попытку с помощью sudo».
Затем я изменил свой ruby-скрипт, чтобы использовать команду sudo для статуса пассажира, что привело к
«плагин exec: exec_read_one: error = sudo: извините, для запуска sudo у вас должен быть tty»
Затем я попытался заставить 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 ]") exit end
# Main
begin # Синхронизировать stdout, чтобы он правильно сбрасывался в collectd. $stdout.sync = истина# Разобрать параметры командной строки hostname = nil sample_interval = 20 # sec, значение по умолчанию 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' sample_interval = arg.to_i end end use if !hostname
# Цикл сбора пока true do start_run = Time.now.to_i next_run = start_run + sample_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
конец конец