我试图使用.jar文件的名称来终止一个已经在运行的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总是返回“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来收集并附加进程的所有输出行,然后打印出该字符串。
请注意,有更好的方法来封装所有这些过程,使其更通用和可重用,同时也使用Java8+API(如流、消费者等)。

09-11 17:30