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

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

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

我想在完成执行之前closures进程。 所以,如果我直接在Windows CMD中运行这个FFMPEG命令,然后在5秒钟后按'CTRL + C',那么进程终止状态为'2'。 我可以播放迄今为止创build的媒体文件。

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

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

我得到状态码“1”,意思是exception终止。 我通过以下方式获得状态:

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

而且我不能播放媒体文件,我认为这是由于进程的exception终止。

那么,我怎样才能终止使用ProcessBuilder创build的进程,就像我们用CMD(CTRL + C)所做的那样,以便我可以播放创build的媒体文件?

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

编辑#01:—共享调查结果

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

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

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

  processToExecute.destroy(); 

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

编辑#02:分享最终的理由

实际上,如果在进程运行时直接按cmd中的“CTRL + C”或“q”,则会成功终止进程,并且在当前正在执行的进程列表中不再显示此进程。

当我调用方法时,

 cmd> processToExecute.destroy(); 

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

同样的情况存在如果我试图通过指定他们的名字或者仍然进程exception终止的pid,在另一个CMD中使用'taskkill'或者'kill'命令来终止这个进程。

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

 tasklist 

因此,从这certificate从应用程序的destroy()方法和从另一个CMD的'taskkill或kill'命令不会终止通常按下'CTRL + C'和'q'的过程。

Solutions Collecting From Web of "如何终止通常使用ProcessBuilder创build的进程"