我正在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”那样正常终止进程。
2条答案
按热度按时间s1ag04yj1#
你需要终止所有的孩子在你的程序与类似的东西:
字符串
6jjcrrmo2#
也许试试。。
字符串
或者您可以尝试写入进程的stdin...
型