我有很多像这样的工人:
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”命令来停止所有进程......这不好玩。
如何启动,停止,重启服务等所有流程?
答案 0 :(得分:3)
听起来你想要一个过程监控系统。有很多解决方案,例如
我最近使用过神。使用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