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

b5lpy0ml  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(154)

我正在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创建),当我使用CMD终止进程时,状态代码为“2”。

EDIT#01:-分享发现

因此,当我尝试删除该文件一旦应用程序终止,我得到以下错误:

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


这意味着进程没有终止它正在执行的命令。该命令仍然占据了这个文件,这就是为什么我无法播放它。当我调用以下命令时,进程将终止:

processToExecute.destroy();


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

EDIT#02:分享终极原因

实际上,如果我直接按下'CTRL+C'或'q'在cmd进程运行时,那么它终止进程成功,这个进程是没有更多的可见在当前正在执行的进程列表。
当我调用method时:

cmd> processToExecute.destroy();


它终止了进程,但是当我看到当前正在执行的进程列表时,我仍然可以在那里看到它们。
如果我试图终止此进程使用'taskkill'或'kill'命令在另一个CMD通过指定他们的名字或PID仍然进程异常终止。
P.S.我使用以下命令查看正在运行的进程:

tasklist


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

s1ag04yj

s1ag04yj1#

你需要终止所有的孩子在你的程序与类似的东西:

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

字符串

6jjcrrmo

6jjcrrmo2#

也许试试。。

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

字符串
或者您可以尝试写入进程的stdin...

process.getInputStream().write(exitCode);

相关问题