2015-01-14 35 views
6

JavaアプリケーションでProcessBuilderを使用してプロセスを作成しています。作成されたプロセスは、実際に指定された宛先メディアファイルにRTSPストリームをコピーするいくつかのFFMPEGコマンドを実行します。通常ProcessBuilderを使用してプロセスを終了する方法

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

実行が完了する前にプロセスを終了したいと考えています。ですから、もし私がこのCMDを直接CMDで実行し、5秒後に 'CTRL + C'を押すと、プロセスはステータス '2'で終了します。これまでに作成したメディアファイルを再生できます。

私が使用して私のJavaアプリケーションで同じ操作を行うのであれば、:

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を使用して作成)を終了します。

EDIT#01:---共有所見

だから、アプリが終了したら、私はそのファイルを削除しようとすると、私は次のエラーを取得する:

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

プロセスが終了されていないことを意味しています実行中のコマンドそのコマンドはまだこのファイルを占領しているので、私はそれを再生できません。

しかし、実行中のタスク(つまりコマンドの実行)はまだ有効です。奇妙な!!!!

EDIT#02:共有究極の理由プロセスが、その後実行されている、それが正常に処理を終了し、このプロセスはにそれ以上表示されていないとき、私は直接CMDに「CTRL + C」または「Q」を押すと実際に

現在実行中のプロセスリスト。

cmd> processToExecute.destroy(); 

それはプロセスを終了さが、私は現在実行中のプロセスのリストを見ると、私はまだそこに上にそれらを見ることができます:

そして、プログラムでは、私は、メソッドを呼び出すとき。

同じシナリオが存在する他のCMDで 'taskkill'または 'kill'コマンドを使用してこのプロセスを終了しようとすると、そのプロセスの名前またはPIDが異常終了して終了します。

P.S.私は、実行中のプロセスを確認するために、次のコマンドを使用します。

tasklist 

だからこのことから、それはその破壊()アプリケーションからの方法と証明「taskkillするか、殺す」「[Ctrl]を押していることを別のCMDからのコマンドが正常に処理が終了されていません+ C 'と' q 'は同じです。

+0

を試してみてください、あなたの記述に基づいて、FF-CEGに制御-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

yes「q」をcmdで送信すると、通常どおりプロセスが終了します。しかし私は私のアプリケーションの中からそれを終了したい。 –

答えて

-2

たぶん、あなたはJavaでこれを行うことができます場合、私は知らない...

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

それとも、プロセスの標準入力に書き込みを試みることができる...

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

Javaの 'Process'クラスには 'inheritIO()'メソッドはありません。 ProcessBuilder builder =新しいProcessBuilder(コマンド); Process processToExecute = builder.start(); –

+0

もう一度、InputStreamに 'write()'メソッドはありません。 OutputStreamに書き込むことができる間に、ただInputStreamから読み込むことができます。 OutputStreamでは意味がありません。 –

+0

彼は誤って印刷した、 'process.getOutputStream()。write(exitCode)'を実行します。 'getInputStream()'は、サブプロセスのSTDOUTに接続された読み取り専用ストリームを返すためです。 'getOutputStream()'は、サブプロセスのSTDINに接続されているストリームを返します。 – Sneg

関連する問題