2017-10-28 17 views
0

크로스 플랫폼 솔루션 (GNU/Linux, Windows)을 사용하여 백그라운드에서 외부 프로그램을 생성하고 그 파일을 pid으로 캡처 한 다음 나중에 pid을 통해 프로그램을 중지하고 싶습니다.Process.spawn (Ruby 1.9.x) : 스폰에 성공했는지 확인하고 오류를 감지하는 방법은 무엇입니까?

pid = Process.spawn("xxx") 
puts pid 

표준 출력/표준 에러 :

루비 1.9.x에서이 코드를 고려 예외가 발생되지

8117 
sh: 1: xxx: not found 

을, 나는 사실을 감지 할 수있는 방법이 표시되지 않습니다 스폰가 성공하지 못했습니다 (xxx은 유효한 명령이 아닙니다).

이 스폰가 성공적이지 않았 음을 감지하는 가장 좋은 방법은 무엇입니까?

답변

1

은 프로세스 ID를 반환합니다. 프로세스 ID가 반환되면 기술적으로 기능 자체가 실패하지 않습니다. Ruby> = 2.0 인 경우 Process#spawn은 명령을 찾지 못하면 Errno::ENOENT을 반환합니다. 루비 1.9는 지원되지 않으므로 루비를 업그레이드하는 것이 가장 좋습니다.

해킹은 호출이 반환 된 후 프로세스가 실제로 실행 중인지 테스트하는 데 도움이 될 수 있습니다. 슬프게도 플랫폼에 따라 다릅니다.

pid = Process.spawn("xxx") 
case RUBY_PLATFORM 
when /linux/i 
    success = File.exist?("/proc/#{pid}") 
when /windows/i 
    # use win32api gem, Windows API call EnumProcesses 
else 
    # ? 
end 

불행하게도 프로세스가 존재할 때까지 프로세스가 완료되면 알 수 없습니다. 아마도 그 결과를 확인하기를 원할 것입니다.

또 다른 방법은 실행중인 프로그램을 제어하는 ​​경우 명명 된 파이프를 실행하기 전에 열어서 루비 프로그램이 실행중인 파이프를 통해 메시지를 보내도록하는 것입니다. 그런 다음 비 차단 방식으로 spawn 호출 후 파이프에서 읽을 수 있으며 영원히 차단되지 않도록 Timeout을 사용하십시오. 더 단순하고 덜 깨끗한 접근법은 그 프로그램이 결정적인 어떤 것을 파일에 쓰도록하는 것일 것입니다.이 프로그램은 여러분이 간단한 File.exist? 테스트를 사용하여 거기에 있는지 확인할 수 있습니다.

+0

도움이되었습니다. 고맙습니다. – cschol