我有一个侦听给定设备的Ruby进程。我想使用rails应用程序为不同的设备启动/关闭它的实例。我可以为Ruby守护进程找到的所有内容似乎都是基于运行的一组守护进程或使用消息队列进行后台处理。
我应该只使用Kernel.spawn
执行此操作并将PID存储在数据库中吗?看起来有点hacky但是如果没有现有的框架允许我调高/调低守护进程,那么我似乎没有多少选择。
答案 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
循环。