由ProcessBuilder创建的进程不会终止

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

我正在用Java代码启动Java进程。我已经编写了一个函数来关闭此过程。但是该过程不会终止。

这是我创建流程的代码:

            Process process = null;

            final ProcessBuilder builder = new ProcessBuilder("java", "-jar", "-Xmx512M", "server.jar");
            builder.directory(new File("temp/"+serverName+"/"));

            try {
                process = builder.start();
            } catch (IOException e) {
                e.printStackTrace();
            }

Launcher.serverProcess.put(serverName, process);

从另一个类,我想停止服务器:

Process temp = Launcher.serverProcess.get(serverName);
            while(temp.isAlive()) {
                temp.destroy();
                temp.destroyForcibly();
            }
            Launcher.serverProcess.remove(serverName);

输入命令以停止该过程后,我要删除目录。每当我尝试此操作时,只会告诉我该文件夹正在使用中,无法删除它。使用taskkill / F / IM java.exe可以停止该过程,然后可以删除该文件夹

java process processbuilder
1个回答
0
投票

我怀疑文件夹仍在使用中的问题可能是因为您的流程实例具有开放流。调用process.destroy()之后,这些流的值仍处于打开状态,等待您访问它们。也可能是该进程还在该进程的当前目录(“ temp /” + serverName +“ /”)上也持有一个锁。

一旦调用process.start(),您应该在后台线程中使用stdout / error流,或者在调用process.destroy()时尝试显式关闭它们,并查看是否允许您清理由您运行的过程。

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