2011-08-31 8 views
0

주어진 장치에서 수신 대기하는 루비 프로세스가 있습니다. 난 레일 애플 리케이션과 다른 장치에 대한 인스턴스를 위/아래로 회전하고 싶습니다. 루비 데몬에서 찾을 수있는 모든 것은 설정된 수의 데몬을 실행하거나 메시지 대기열을 사용하여 백그라운드 처리를 기반으로하는 것으로 보입니다.동적 루비 데몬 관리

Kernel.spawn으로 이것을 수행하고 PID를 데이터베이스에 저장해야합니까? 조금 해킹 된 것 같지만 데몬을 올리거나 내릴 수있는 기존 프레임 워크가 없다면 많은 선택의 여지가없는 것 같습니다.

+0

"수신 대기"란 무엇을 의미합니까? –

+0

직렬 포트에서 수신 대기하려면 serialport gem을 사용하고 있습니다. –

답변

1

다른 스크립트를 생성하고 데이터베이스에 PID를 유지하는 대신 fork을 사용하고 PID를 메모리에 유지하면서 동일한 스크립트 내에서 모두 수행 할 수 있습니다. 다음은 샘플 스크립트 - 당신이 "종료"로 종료, 명령 콘솔에서 "델", "추가"를 입력하여 "노동자 인스턴스"를 추가 및 삭제 : 물론

@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 앱 또는 소켓 인터페이스 또는 명명 된 파이프로 바꿀 수 있습니다.

+0

이것은 훨씬 간단한 해결책입니다. 나는 그 문제를 과도하게 생각하고 있었다. 나는 이미 나를 위해 모든 것을하는 고립 된 클래스를 가지고 있기 때문에 나는 내 마음의 내용에'fork() '할 수있다. –