动态Ruby守护进程管理

时间:2011-08-31 04:39:45

标签: ruby-on-rails ruby daemon

我有一个侦听给定设备的Ruby进程。我想使用rails应用程序为不同的设备启动/关闭它的实例。我可以为Ruby守护进程找到的所有内容似乎都是基于运行的一组守护进程或使用消息队列进行后台处理。

我应该只使用Kernel.spawn执行此操作并将PID存储在数据库中吗?看起来有点hacky但是如果没有现有的框架允许我调高/调低守护进程,那么我似乎没有多少选择。

1 个答案:

答案 0 :(得分:1)

您可以使用fork在同一脚本中完成所有操作,并将PID保留在内存中,而不是生成另一个脚本并将PID保留在数据库中。这是一个示例脚本 - 您可以通过在控制台中键入命令“add”和“del”来添加和删除“worker instances”,并以“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

当然,这只是一个示例,对于发送命令和/或监视实例,您可以使用小型Sinatra应用程序或套接字接口或命名管道等替换此简单gets循环。