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

Bil*_*een 6 java windows ffmpeg kill-process processbuilder

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

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

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

所以,如果我在Java应用程序中执行相同的操作:

 process.destroy(); //I call this method after 5 sec
Run Code Online (Sandbox Code Playgroud)

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

 processToExecute.destroy();
 processToExecute.exitValue(); //This return me status '1'
Run Code Online (Sandbox Code Playgroud)

我无法播放媒体文件,我认为这是由于该过程的异常终止.

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

我想在Java应用程序中终止进程(使用ProcessBuilder创建),状态代码为'2',这是我在使用CMD终止进程时获得的.

编辑#01:---分享调查结果

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

The Action Can't be Performed Because File is Opened in FFMPEG.exe
Run Code Online (Sandbox Code Playgroud)

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

 processToExecute.destroy();
Run Code Online (Sandbox Code Playgroud)

但是,它正在执行的任务(即执行命令)仍然有效.奇怪!!!!

编辑#02:分享终极理由

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

并以编程方式调用方法:

cmd> processToExecute.destroy();
Run Code Online (Sandbox Code Playgroud)

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

并存在相同的情况如果我尝试使用另一个CMD中的'taskkill'或'kill'命令终止此过程,方法是指定其进程异常终止的名称或pid.

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

tasklist
Run Code Online (Sandbox Code Playgroud)

因此,它证明了来自Application的destroy()方法和来自另一个CMD的'taskkill或kill'命令通常不会按"CTRL + C"和"q"来终止该过程.

Joe*_*Joe -4

也许尝试...

builder.inheritIO();
System.exit(2);
Run Code Online (Sandbox Code Playgroud)

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

process.getInputStream().write(exitCode);
Run Code Online (Sandbox Code Playgroud)