如何终止使用ProcessBuilder正常创建的进程

时间:2015-01-14 12:11:17

标签: java windows ffmpeg processbuilder kill-process

我在Java应用程序中使用ProcessBuilder创建进程。创建的进程执行一些FFMPEG命令,这些命令实际上将RTSP流复制到指定的目标媒体文件中。

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

我希望在完成执行之前关闭该进程。因此,如果我直接在Windows CMD中运行此FFMPEG命令,然后按“CTRL + C' 5秒后,处理终止,状态为' 2'。我可以播放到目前为止创建的媒体文件。

因此,如果我使用以下命令在我的Java应用程序中执行相同的操作:

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

我收到状态代码' 1'这意味着异常终止。我通过以下方式获得状态:

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

我无法播放媒体文件,我认为这是因为该过程异常终止。

那么我如何终止使用ProcessBuilder创建的进程,就像我在CMD中使用(CTRL + C)一样,以便我可以播放创建的媒体文件?

我想在Java应用程序中终止进程(使用ProcessBuilder创建),状态代码为' 2'当我使用CMD终止进程时,我得到了。

编辑#01:---共享结果

因此,当我尝试在应用终止后删除该文件时,我收到以下错误:

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

这意味着进程不会终止正在执行的命令。该命令仍然占用了这个文件,这就是为什么我无法播放它。当我打电话时,进程终止:

 processToExecute.destroy();

但是,它正在执行的任务(即执行命令)仍处于活动状态。奇怪!!!!

编辑#02:分享终极理由

实际上如果我直接按下CTRL + C'或者' q'在cmd中,当进程正在运行时,它会成功终止进程,并且此进程在当前正在执行的进程列表中不再可见。

以编程方式调用方法:

cmd> processToExecute.destroy();

它会终止进程但当我看到当前正在执行的进程列表时,我仍然可以在那里看到它们。

同样的情况如果我尝试使用' taskkill'来终止此过程。或者' kill'通过指定其进程异常终止的名称或pid在另一个CMD中命令。

P.S。我使用以下命令查看正在运行的进程:

tasklist

因此,它证明了应用程序中的destroy()方法和“任务杀死”或“杀死”。来自另一个CMD的命令通常不会终止正在按下' CTRL + C'和' q'确实

1 个答案:

答案 0 :(得分:-2)

也许试试......

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

或者您可以尝试写入流程的标准输入...

process.getInputStream().write(exitCode);
相关问题