Linux 从 java 控制台应用程序中杀死 Java 进程
Linux kill Java Process from java console application
我正在尝试使用 .jar 文件的名称终止已经 运行ning java 的进程。
运行执行命令
时完全正常
pkill -9 -f myapp.jar
来自终端,但当您 运行 在 ProcessBuilder 中使用相同的命令时它不起作用。
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 总是 return '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
命令没有 运行 正确,您的方法也将始终 return 为真。
理想情况下应该使用 Process#waitFor
等待进程终止,然后调用 Process#exitValue
来检索命令的退出状态。那么你应该 return true 或 false 基于退出代码是 0 还是其他任何东西。
最后,为了提高效率,我建议使用 StringBuilder
来收集和附加所有进程的输出行,然后打印出该字符串。
请注意,有更好的方法来封装所有这些过程,使其更通用和可重用,同时还使用 Java 8+ API(如流、消费者等)。
我正在尝试使用 .jar 文件的名称终止已经 运行ning java 的进程。
运行执行命令
时完全正常pkill -9 -f myapp.jar
来自终端,但当您 运行 在 ProcessBuilder 中使用相同的命令时它不起作用。
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 总是 return '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
命令没有 运行 正确,您的方法也将始终 return 为真。
理想情况下应该使用 Process#waitFor
等待进程终止,然后调用 Process#exitValue
来检索命令的退出状态。那么你应该 return true 或 false 基于退出代码是 0 还是其他任何东西。
最后,为了提高效率,我建议使用 StringBuilder
来收集和附加所有进程的输出行,然后打印出该字符串。
请注意,有更好的方法来封装所有这些过程,使其更通用和可重用,同时还使用 Java 8+ API(如流、消费者等)。