2010-03-30 4 views
3

Java에서 시작하는 프로세스에 대한 시간 초과가 필요합니다. 시간 초과 후, 나는 그 과정을 죽이고 싶다. 여태까지는 그런대로 잘됐다. 문제는, 정상적인 실행과 타임 아웃 후에 stderr/stdout을 캡쳐하고 싶습니다. destroy()로 프로세스를 죽이면 어떻게됩니까? 지금까지 생성 된 stderr/stdout (부분)을 검색 할 수 있습니까? 아니면 그들은 갔습니까?Java에서 Process.destroy() 다음에 stderr/stdout 스트림은 어떻게됩니까?

+0

어떻게 stdout과 stderr를 읽으십니까? 어떻게 거기에 "부분적인"결과가있을 수 있습니까? –

+0

프로세스가 시간 초과되어 죽이면 부분적인 결과가 발생합니다. 아직, 나는 나중에 조사를 위해 그들을 포착하고 싶다. –

답변

3

Process.exec()/waitFor()/destroy()을 호출하는 스레드와 별도로 stdoutstderr (병합 한 경우)을 나타내는 하나 또는 두 개의 개별 스레드가 있어야합니다. 읽기 스레드는 EOF까지 생성 된 모든 데이터를 가져옵니다. Process.destroy()으로 전화하면 EOF가 더 빨리 발생할 수 있습니다.

+0

그래,하지만 그냥 프로세스를 죽이고 * stderr/stdout을 수집하려고하면 어떻게 될까? 그게 내 질문이다. –

+0

잘못된 순서로 일을하고있는 것입니다. 하지마. – EJP

+2

멀티 스레드, 멀티 코어 환경에서 "주문"이란 무엇입니까? 그러므로 내 질문. –

3

프로세스 처리는 본질적으로 OS에 따라 다르며 여기서는 Java가 Unix 프로세스를 처리하는 방식을 구체적으로 살펴 보았습니다.

Process closes its streams when you call .destroy()은 불행합니다. JDK 설계자가 올바른 디자인 패턴을 느낀 이유를 모르지만 종료 된 프로세스를 다루는 일은 더욱 복잡해집니다.

그것은 InputStreamProcess 실제로 우리가 원하는 것 정확히 않는 drainInputStream() 방법이있다 ProcessPipeInputStream의 인스턴스는 보유하고 있음을 주목할 필요가 - 그것은 바이트 버퍼에 남아있는 배킹 파일 기술자 바이트 저장을 읽는다 우리를 위해. 이 메소드는 "프로세스가 종료 될 때 프로세스 리퍼 스레드에 의해 호출되지만, TERM.destroy() 인 경우 불행히도 호출되지 않습니다.

당신이 다음에 대한 희망을 수있는 최선의

는 방편에 자신의 drainInputStream() 행동이며 .destroy()를 호출하기 전에 stdoutstderr 모두를 부르지. 일부 데이터는 두 스트림 중 하나에 기록한 후에도 여전히 배출 될 수 있지만 .destroy() 완료 전에는 이됩니다.

관련 문제