2015-01-14 3 views
6

Java 응용 프로그램에서 ProcessBuilder를 사용하여 프로세스를 생성합니다. 생성 된 프로세스는 실제로 지정된 대상 미디어 파일에서 RTSP 스트림을 복사하는 FFMPEG 명령을 실행합니다.프로세스를 정상적으로 종료하는 방법 ProcessBuilder를 사용하여 생성

ProcessBuilder builder = new ProcessBuilder("ffmpeg", "-i", RTSP_URL, "-f", fileFormat, destFilePath); 
Process processToExecute = builder.start(); 

프로세스가 완료되기 전에 프로세스를 닫고 싶습니다. 그래서, 만약 내가이 FFMPEG 명령을 직접 CMD에서 실행하고 5 초 후 'CTRL + C'를 누르면 프로세스가 '2'상태로 끝납니다. 그리고 지금까지 생성 된 미디어 파일을 재생할 수 있습니다. 내가 사용하여 내 자바 응용 프로그램에서 같은 작업을 할 경우

그래서 :

process.destroy(); //I call this method after 5 sec 

을 나는 상태 코드를 얻을 수 '1'비정상 종료를 의미한다. 다음과 같은 방법으로 상태를 알 수 있습니다 :

processToExecute.destroy(); 
processToExecute.exitValue(); //This return me status '1' 

나는 미디어 파일을 재생할 수 없으며 이것은 프로세스가 비정상적으로 종료 된 것으로 생각됩니다.

그래서 내가 만든 미디어 파일을 재생할 수 있도록 (Ctrl + C)를 사용하여 CMD에서와 동일한 방식으로 ProcessBuilder를 사용하여 만든 프로세스를 종료 할 수 있습니까?

CMD를 사용하여 프로세스를 종료 할 때 상태 코드가 '2'인 Java 응용 프로그램에서 ProcessBuilder를 사용하여 생성 된 프로세스를 종료하고 싶습니다.

편집 # 01 : --- 공유 연구 결과

그래서, 응용 프로그램이 종료되면 내가 그 파일을 삭제하려고 할 때, 나는 다음과 같은 오류가 발생합니다 :

The Action Can't be Performed Because File is Opened in FFMPEG.exe 

프로세스가 종료되지 않는다는 것을 의미합니다 실행중인 명령. 그 명령은 여전히이 파일을 점령했기 때문에 내가 그 파일을 재생할 수없는 이유입니다. 프로세스가 호출되면 종료됩니다.

그러나 수행중인 작업 (즉 명령 실행)은 여전히 ​​활성화되어 있습니다. 이상한!!!!

편집 # 02 : 공유 궁극적 인 이유 프로세스가 다음 실행이 성공적으로 프로세스를 종료하고이 과정이에서 더 이상 볼 수 없을 때 내가 직접 cmd를 'Ctrl + C'또는 'Q'를 누르면 실제로

현재 실행중인 프로세스 목록.

cmd> processToExecute.destroy(); 

그것은 프로세스를 종료하지만 현재 실행중인 프로세스의 목록을 볼 때 여전히 거기에 그들을 볼 수 있습니다 :

그리고, 프로그램은 내가 메서드를 호출 할 때.

동일한 시나리오가 존재합니다.이 프로세스를 종료하려면 'taskkill'또는 다른 CMD에서 'kill'명령을 사용하십시오. 프로세스의 이름이나 PID를 지정하여 프로세스가 비정상적으로 종료됩니다.

P.이에서 그래서

tasklist 

은 그) (파괴 응용 프로그램에서 방법 '에서 taskkill 또는 kill'다른 CMD에서 명령은 일반적으로 그 누르면 'CTRL을 프로세스를 종료되지 증명 : 나는 실행중인 프로세스를 보려면 다음 명령을 사용하여 + C '와'q '가됩니다.

+0

자바에서이 작업을 수행 할 수 있는지 모르겠어요, 그러나 당신의 설명에 따라, 당신은 FFMPEG에 control-C 신호를 보낼 필요가있다. 이렇게하기위한 Win32 API 호출은 [GenerateConsoleCtrlEvent] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155%28v=vs.85%29.aspx)입니다. 덧붙여 말하자면,이 문제는 상태 코드 자체가 아니라 다른 증상 일뿐입니다. 상태 코드 2로 프로세스를 종료하는 것은 상태 코드 1로 프로세스를 종료하는 것과 다르지 않습니다. 프로세스가 정리 루틴을 실행할 수 있도록 종료하도록 요청해야합니다. –

+0

ffmpeg 인 경우, 'q'키를 사용하여 종료하도록 지시하십시오. – rogerdpack

+0

예 'q'를 cmd를 통해 보내면 정상적으로 프로세스가 종료됩니다. 하지만 내 응용 프로그램 내에서 종료하고 싶습니다. –

답변

-2

어쩌면 시도 ...

builder.inheritIO(); 
System.exit(2); 

아니면 프로세스의 표준 입력에 쓰기를 시도 할 수 ...

process.getInputStream().write(exitCode); 
+0

Java의 'Process'클래스에는 'inheritIO()'메소드가 없습니다. ProcessBuilder builder = 새 ProcessBuilder (명령); 프로세스 processToExecute = builder.start(); –

+0

또 다시, InputStream에는 'write()'메소드가 없습니다. OutputStream에서 Write 할 수있는 동안 InputStream에서 읽을 수 있습니다. 그리고 OutputStream을 사용하는 것은 의미가 없습니다. –

+0

그가 잘못 인쇄하면, 그는'process.getOutputStream(). write (exitCode)'를 사용합니다. 'getInputStream()'은 서브 프로세스의 STDOUT에 연결된 읽기 전용 스트림을 반환하기 때문입니다. 'getOutputStream()'은 서브 프로세스의 STDIN에 연결된 stream을 반환합니다. – Sneg