如何管理ruby worker进程启动,停止和重启?

时间:2014-06-12 10:20:43

标签: ruby bash zeromq worker

我有很多像这样的工人:

Client.rb                      Worker.rb
 |                              |
 |- Client1.rb <=>          <=> |- Worker1.rb   
 |- Client2.rb <=> Proxy.rb <=> |- Worker2.rb
 |- Client3.rb <=>          <=> |- Worker3.rb

进程间通信使用ZMQ

完成

实际上,我使用这个bash脚本在后台启动所有进程:

#!/bin/bash

ruby Proxy.rb &
ruby Worker.rb &
ruby Client.rb &

例如,这个脚本强迫我使用“kill”命令来停止所有进程......这不好玩。

如何启动,停止,重启服务等所有流程?

2 个答案:

答案 0 :(得分:3)

听起来你想要一个过程监控系统。有很多解决方案,例如

  • monit
  • bluepill

我最近使用过神。使用god创建一个配置文件,定义每个worker,如何停止/启动它以及何时应该自动重启(例如,如果它使用了太多的内存)

只要您可以设置脚本以将pid文件放在可预测的位置,那么它非常简单。例如,如果您的上帝配置文件包含

ROOT = "/folder/containing/files"

3.times do |num|
  God.watch do |w|
    w.group = "workers" 
    w.name = "worker-#{num}"
    w.dir = ROOT
    w.start = "ruby ./Worker.rb --pid tmp/pids/worker.#{num}.pid "
    w.pid_file = File.join(ROOT, "tmp/pids/worker.#{num}.pid") 
    w.behavior(:clean_pid_file)

    w.start_if do |start|
      start.condition(:process_running) do |c|
        c.interval = 5.seconds
        c.running = false
      end
    end
  end
end

然后god start worker-0(或停止,重启)将对第一个工作人员起作用,而god start workers将启动所有3个工作人员(如果他们崩溃则再次启动它们)。您需要更改脚本以将其pid文件写入--pid参数

指示的位置

答案 1 :(得分:0)

对于PID-s等的 shell控制,Tom Dysinger有一个很好的故障:

./sample server   & server=$!    
./sample worker0  &  node0=$!
./sample worker1  &  node1=$!
./sample worker2  &  node2=$!
./sample worker3  &  node3=$!

... alowing finally to

kill $node0 $node1 $node2 $node3 $server