2012-03-21 1 views
4

저는 궁극적으로 꽤 오랜 시간이 걸리는 시스템 프로세스를 시작하는 루비 스크립트를 만들고 있습니다. 이 프로세스의 표준 오류에서 읽은 다음 결과에 따라 반응해야합니다.Ruby에서 커널 # select의 요점은 무엇입니까?

나는 현재와 같은 그 일을 해요 :

Open3.popen3(cmd_to_run) do |stdin, stdout, stderr, waitthread| 
    stderr.each_line do |line| 
    # look out for specific lines and react to them accordingly 
    end 
end 

그러나 나는 또한 구현 비슷한 달성하기 위해 본 적이 있지만 kernel#select으로 그 일 :

Open3.popen3(cmd_to_run) do |stdin, stdout, stderr, waitthread| 
    io = select([stderr], nil, nil, 30) 

    if io.nil? 
    log("Command timed out during Kernel#select") 
    return 
    end 

    io[0][0].each_line do |line| 
    # look out for specific lines and react to them accordingly 
    end 

end 

나는 곡괭이를 읽었습니다 왜 선택합니까에 대한 설명,하지만 내가 (해야한다면) 그것을 사용해야하는 이유에 관해서는 혼란스러워합니까? 첫 번째 방법은 똑같이 작동합니다.

답변

6

아마 두 가지 이유 :

  1. 당신은 당신이 each_line
  2. 에 둘 이상의 IO 객체, 전자 기다릴 수없는 제한 시간을 사용할 수 있습니다. 지. io = select([stdout, stderr]) 및 둘 이상의 이벤트 (예 : 이벤트 또는 예외 작성)
+0

IO 객체에서 "대기"해야하는 이유에 대해 혼란스러워합니다. 프로세스를 시작한 후 바로 사용할 수없는 이유는 무엇입니까? – Brian

+1

IO 객체는 즉시 사용할 수 있지만, 예를 들어'stdout'을 읽으려고 할 때 (아직) 아무 것도 없으면 모니터링 프로세스가 차단됩니다. 당신의 시스템 프로세스가'stderr' 진단을 출력하고 답장을 기다리는 것을 상상해보십시오.하지만 stdout이 아니라'stderr' 였기 때문에'stdout'에서 무언가를 영원히 기다리게 될 것입니다. 'select'는 당신이 처리 할 수 ​​있도록 뭔가 일이 일어 났을 때 당신이 사용할 수있는 IO 객체를 반환합니다. –

관련 문제