Динамическое управление Ruby Daemon - PullRequest
0 голосов
/ 31 августа 2011

У меня есть процесс Ruby, который прослушивает данное устройство.Я хотел бы раскрутить экземпляры вверх / вниз для разных устройств с приложением rails.Все, что я могу найти для Ruby-демонов, похоже, основано на заданном количестве запущенных демонов или фоновой обработке с очередями сообщений.

Должен ли я просто делать это с Kernel.spawn и хранить PID в базе данных?Это кажется немного хакерским, но если нет существующего фреймворка, который позволял бы мне поднимать / опускать демонов, то у меня, возможно, не было большого выбора.

1 Ответ

1 голос
/ 31 августа 2011

Вместо того, чтобы порождать другой скрипт и хранить PID в базе данных, вы можете делать все это в одном скрипте, используя fork и сохраняя PID в памяти. Вот пример сценария - вы добавляете и удаляете «рабочие экземпляры», набирая команды «add» и «del» в консоли, выходя с «quit»:

@pids = []
@counter = 0

def add_process
  @pids.push(Process.fork {
    loop do
      puts "Hello from worker ##{@counter}"
      sleep 1
    end
  })
  @counter += 1
end

def del_process
  return false if @pids.empty?
  pid = @pids.pop
  Process.kill('SIGTERM', pid)
  true
end

def kill_all
  while del_process
  end
end

while cmd = gets.chomp
  case cmd.downcase
  when 'quit'
    kill_all
    exit
  when 'add'
    add_process
  when 'del'
    del_process
  end
end

Конечно, это всего лишь пример, и для отправки команд и / или экземпляров мониторинга вы можете заменить этот простой цикл gets небольшим приложением Sinatra, или интерфейсом сокета, или именованными каналами и т. Д.

...