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

问题描述 投票:0回答:2

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

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

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

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

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

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

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

而且我无法播放媒体文件,我认为这是由于进程异常终止造成的。

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

我想终止 Java 应用程序中的进程(使用 ProcessBuilder 创建),当我使用 CMD 终止进程时,状态代码为“2”。

编辑#01:---分享发现

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

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

这意味着进程不会终止它正在执行的命令。该命令仍然占用了该文件,这就是我无法播放它的原因。当我调用时进程终止:

 processToExecute.destroy();

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

编辑#02:分享终极原因

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

当我调用方法时以编程方式:

cmd> processToExecute.destroy();

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

并且存在相同的情况,如果我尝试在另一个 CMD 中使用“taskkill”或“kill”命令通过指定其名称或 pid 来终止此进程,该进程仍然会异常终止。

附注我使用以下命令来查看正在运行的进程:

tasklist

由此证明,应用程序中的 destroy() 方法和另一个 CMD 中的“taskkill 或kill”命令不会像按“CTRL+C”和“q”那样正常终止进程。

java windows ffmpeg processbuilder kill-process
2个回答
0
投票

您需要终止您的收益中的所有子项,例如:

process.children().forEach(processHandle -> processHandle.destroy());
process.destroy();

-3
投票

也许尝试一下...

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

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

process.getInputStream().write(exitCode);
© www.soinside.com 2019 - 2024. All rights reserved.