Linux 从 Java 控制台应用程序杀死 Java 进程



我正在尝试使用.jar文件的名称杀死已经在运行的 Java 进程。

运行命令时完全可以正常工作

普基尔 -9 -F 米亚普.jar

从终端,但当您在进程生成器中运行相同的命令时,它不起作用。

BufferedReader killStream;
String line;
try{
String[] args = new String[] {"pkill", "-9", "-f", " myapp.jar"}; 
Process proc = new ProcessBuilder(args).start();
killStream = new BufferedReader(new InputStreamReader(proc.getInputStream()));
line = killStream.readLine();
System.out.println(line);
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}

killStream 始终返回 'null'

我在这里做错了什么?

除了上面提到的关于传入参数的内容之外,这里还有一些遗漏点,你的代码可以通过更多的改进来做一些改进。

首先,为什么不使用 try with resources 子句来确保您的资源得到自动管理并始终正确关闭?

考虑到这一点,您的代码将如下所示:

try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
// code to parse the command's output.
} catch (IOException e) {
// code to handle exceptions
}

其次,使用当前代码,即使pkill命令未正确运行,您的方法也将始终返回 true。

理想情况下,应使用Process#waitFor等待进程终止,然后调用Process#exitValue来检索命令的退出状态。然后,您应该根据退出代码是 0 还是其他任何内容返回 true 或 false。

最后,为了提高效率,我建议使用StringBuilder来收集和附加所有进程的输出行,然后打印出该字符串。

请注意,还有更好的方法来封装所有这些过程,使其更加通用和可重用,同时还使用 Java 8+ API(如流、消费者等(。

最新更新