【问题标题】:Dynamic Ruby Daemon Management动态 Ruby 守护进程管理
【发布时间】:2011-08-31 04:39:44
【问题描述】:

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

我应该只使用Kernel.spawn 执行此操作并将 PID 存储在数据库中吗?这似乎有点老套,但如果没有允许我启动/关闭守护进程的现有框架,我似乎没有太多选择。

【问题讨论】:

  • “在设备上收听”是什么意思?
  • 我正在使用串口 gem 来监听串口。

标签: ruby-on-rails ruby daemon


【解决方案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

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

【讨论】:

  • 这是迄今为止最简单的解决方案。我只是想多了这个问题。因为我已经有一个独立的班级可以为我做所有事情,所以我可以 fork() 尽情享受。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2012-02-13
  • 2012-09-05
  • 1970-01-01
  • 2011-01-30
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多