2011-11-12 3 views
1

'worker.rb'라는 스크립트가 있습니다. 이 스크립트를 실행하면 잠시 (한시간 동안) 처리 한 다음 죽을 것입니다.Ruby 여러 작업자를 생성하는 데몬 프로세스를 만드는 방법

위 작업자 스크립트를 생성하는 또 다른 스크립트가 필요합니다. 이 스크립트를 'runner.rb'라고 부르 자. 'runner.rb'는 얼마나 많은 작업자가 스폰되도록 허용되는지 인수를 지정하여 호출됩니다.

내가 할 runner.rb 싶습니다 다음 (예를 들어, '루비 runner.rb 5') 를 - 'worker.rb의 스폰 5 인스턴스 - 제 (예를 들어있어 100 개 값) 특정 값에 대한 데이터베이스 쿼리 '(각각 처음 5 개의 값을 전달) - 위에서 생성 된'worker.rb '의 인스턴스를 확인한 다음 데이터베이스에서 6 번째 값으로'worker.rb '를 다시 호출하고이 프로세스를 무기한 계속 진행합니다.

나는 데몬 스 보석을 사용하고 있지만 이것에 관해 가장 좋은 방법은 분실되었다. '주자 (runner)'스크립트는 반드시 대몬 화해야합니다. 그러나 작업자도 대몬 화해야합니까?

'주자'가 '작업자'가 완료되었는지 여부를 확인하는 방법은 무엇입니까? 파일에 저장된 PID를 사용하여이를 수행 할 수 있습니까?

+0

heroku에서이 작업을 수행하고 있습니까? – Sean

답변

0

이전에는 데몬 스 보석을 사용했습니다. 그러나 어쨌든 그것은 자식 프로세스의 수를 유지하는 데는별로 도움이되지 못했습니다. 그런 다음 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 번 호출 한 후 작업자 프로세스가 종료됩니다. 그런 다음 새 작업자 프로세스가 생성되고 프로세스가 계속됩니다.