Java에서 시작하는 프로세스에 대한 시간 초과가 필요합니다. 시간 초과 후, 나는 그 과정을 죽이고 싶다. 여태까지는 그런대로 잘됐다. 문제는, 정상적인 실행과 타임 아웃 후에 stderr/stdout을 캡쳐하고 싶습니다. destroy()로 프로세스를 죽이면 어떻게됩니까? 지금까지 생성 된 stderr/stdout (부분)을 검색 할 수 있습니까? 아니면 그들은 갔습니까?Java에서 Process.destroy() 다음에 stderr/stdout 스트림은 어떻게됩니까?
답변
Process.exec()/waitFor()/destroy()
을 호출하는 스레드와 별도로 stdout
과 stderr
(병합 한 경우)을 나타내는 하나 또는 두 개의 개별 스레드가 있어야합니다. 읽기 스레드는 EOF까지 생성 된 모든 데이터를 가져옵니다. Process.destroy()
으로 전화하면 EOF가 더 빨리 발생할 수 있습니다.
그래,하지만 그냥 프로세스를 죽이고 * stderr/stdout을 수집하려고하면 어떻게 될까? 그게 내 질문이다. –
잘못된 순서로 일을하고있는 것입니다. 하지마. – EJP
멀티 스레드, 멀티 코어 환경에서 "주문"이란 무엇입니까? 그러므로 내 질문. –
프로세스 처리는 본질적으로 OS에 따라 다르며 여기서는 Java가 Unix 프로세스를 처리하는 방식을 구체적으로 살펴 보았습니다.
Process
closes its streams when you call .destroy()
은 불행합니다. JDK 설계자가 올바른 디자인 패턴을 느낀 이유를 모르지만 종료 된 프로세스를 다루는 일은 더욱 복잡해집니다.
그것은 InputStream
의 Process
실제로 우리가 원하는 것 정확히 않는 drainInputStream()
방법이있다 ProcessPipeInputStream
의 인스턴스는 보유하고 있음을 주목할 필요가 - 그것은 바이트 버퍼에 남아있는 배킹 파일 기술자 바이트 저장을 읽는다 우리를 위해. 이 메소드는 "프로세스가 종료 될 때 프로세스 리퍼 스레드에 의해 호출되지만, TERM
이 .destroy()
인 경우 불행히도 호출되지 않습니다.
당신이 다음에 대한 희망을 수있는 최선의
는 방편에 자신의drainInputStream()
행동이며
.destroy()
를 호출하기 전에
stdout
및
stderr
모두를 부르지. 일부 데이터는 두 스트림 중 하나에 기록한 후에도 여전히 배출 될 수 있지만
.destroy()
완료 전에는 이됩니다.
- 1. "foreach()에 잘못된 인수가 제공되었습니다."- 다음에 어떻게됩니까?
- 2. 서블릿에서 브라우저로 파일을 보낼 때 출력 스트림은 어떻게됩니까?
- 3. Java에서 시작된 하위 프로세스는 waitFor를 사용하여 종료되지만 스트림은 종료되지 않습니다.
- 4. 실제로 필터 스트림은 무엇을합니까?
- 5. 로그 스트림은 어디로 이동합니까?
- 6. 스트림은 언제 지연되어야합니까?
- 7. : checked 라디오 버튼 다음에 나오는 텍스트의 스타일은 어떻게됩니까?
- 8. 네트워크 스트림은 항상 비어 있습니다!
- 9. SIGKILL Process.destroy()를 사용하여 java에서 Linux 프로세스를 죽일 수있는 방법 SIGTERM
- 10. Java에서 hasNextLine을 사용하면 NextInt 다음에 NextLine을 읽지 않습니다.
- 11. Response.Redirect 다음에 함수 호출하기
- 12. Java에서 두 클래스가 동시에 세 번째 클래스의 메서드를 호출하면 어떻게됩니까?
- 13. Java에서 빈 문자열을 연결할 때 컴파일 및 런타임시 어떻게됩니까?
- 14. 는 다음에
- 15. 분산 버전 제어는 어떻게됩니까?
- 16. 공개 스트림은 PHP로 페이스 북의 사용자 벽에?
- 17. 타사 입력/출력 스트림은 어떻게 처리해야합니까?
- 18. 모바일 프로 비젼이 만료되면 어떻게됩니까?
- 19. Java ProcessBuilder process.destroy()가 winXP에서 자식 프로세스를 종료하지 않음
- 20. Process.destroy()를 사용하여 프로세스를 종료 할 수 없습니다.
- 21. 자바 Process.Destroy() Runtime.getRuntime()를 사용하여 프로그램을 실행 나는 자바 프로세스를
- 22. CVSNT는 어떻게됩니까?
- 23. TortoiseSvn Merge 다음에 패치 생성 다음에 새 파일이 포함되지 않습니다.
- 24. 마지막 번호 다음에
- 25. webmethod 다음에 리디렉션
- 26. Android 애니메이션 다음에 하나씩
- 27. jcarousel 문제 다음에 클릭하십시오.
- 28. 어떤 기술을 다음에 탐구해야합니까?
- 29. 현재 함수 다음에 함수가로드되었습니다.
- 30. 슬러그 필드 다음에 url이옵니다.
어떻게 stdout과 stderr를 읽으십니까? 어떻게 거기에 "부분적인"결과가있을 수 있습니까? –
프로세스가 시간 초과되어 죽이면 부분적인 결과가 발생합니다. 아직, 나는 나중에 조사를 위해 그들을 포착하고 싶다. –