我有一个名为'worker.rb'的脚本。运行时,此脚本将执行一段时间的处理(一小时可以说),然后死亡。
我需要另一个脚本来负责产生上面的worker脚本。我们称这个脚本为'runner.rb'。 'runner.rb'将通过一个参数来调用,该参数指示允许产生多少工人。
我想让runner.rb做以下事情:(例如'ruby runner.rb 5') - 在数据库中查询特定值(例如,获得100个值) - 产生5个'worker.rb'实例(分别传递前5个值) - 继续检查上面生成的'worker.rb'的任何实例,然后再次使用数据库中的第6个值调用'worker.rb',并无限期地继续此过程。
我正在使用守护进程的宝石,但我失去了最好的方法来解决这个问题。 “跑步者”脚本肯定应该被守护 - 但工作人员是否也应该被守护?
'跑步者'应该如何检查“工人”是否已经完成?可以使用存储在文件中的PID来完成吗?
答案 0 :(得分:0)
之前我使用过Daemons gem。但不知何故,它在保持子进程数量方面表现不佳。然后我做了另一个,叫做light_daemon。您可以让light_daemon预先执行一定数量的工作进程。如果其中一个工人因任何原因死亡,light_daemon将生成一个新的替换它。如果您的工作进程可能导致内存泄漏问题,您可以让工作在它变得太大之前主动死亡。父进程将保持工作进程的数量不变。我在我的一个项目的生产现场使用它。我工作得很好。
以下是使用light-daemon gem的示例守护程序。
require 'rubygems'
require 'light_daemon'
class Client
def initialize
@count = 0
end
def call
`echo "process: #{Process.pid}" >> /tmp/light-daemon.txt`
sleep 3
@count +=1
(@count < 100)? true : false
end
end
LightDaemon::Daemon.start(Client.new, :children=> 2, :pid_file => "/tmp/light-daemon.pid" )
在守护进程中,工作进程在调用方法“call”100次后死亡。然后生成一个新的工作进程,并继续该过程。