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
나는 곡괭이를 읽었습니다 왜 선택합니까에 대한 설명,하지만 내가 (해야한다면) 그것을 사용해야하는 이유에 관해서는 혼란스러워합니까? 첫 번째 방법은 똑같이 작동합니다.
IO 객체에서 "대기"해야하는 이유에 대해 혼란스러워합니다. 프로세스를 시작한 후 바로 사용할 수없는 이유는 무엇입니까? – Brian
IO 객체는 즉시 사용할 수 있지만, 예를 들어'stdout'을 읽으려고 할 때 (아직) 아무 것도 없으면 모니터링 프로세스가 차단됩니다. 당신의 시스템 프로세스가'stderr' 진단을 출력하고 답장을 기다리는 것을 상상해보십시오.하지만 stdout이 아니라'stderr' 였기 때문에'stdout'에서 무언가를 영원히 기다리게 될 것입니다. 'select'는 당신이 처리 할 수 있도록 뭔가 일이 일어 났을 때 당신이 사용할 수있는 IO 객체를 반환합니다. –