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

时间:2018-08-20 09:35:46

标签: java linux process java-8 processbuilder

我正在尝试使用.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'

我在这里做什么错了?

1 个答案:

答案 0 :(得分:0)

除了上面提到的有关传递参数以实现更多优化的参数外,这里还有一些遗漏之处。

首先,为什么不使用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来收集和附加该进程的所有输出行,并仅打印出该String。

请注意,还有更好的方法可以封装所有这些过程,从而使其更加通用和可重复使用,同时还使用Java 8+ API(例如流,使用者等)。