Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux从Java控制台应用程序杀死Java进程_Java_Linux_Process_Java 8_Processbuilder - Fatal编程技术网

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

Linux从Java控制台应用程序杀死Java进程,java,linux,process,java-8,processbuilder,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 = n

我试图用.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(如流、消费者等)。

可能没有关系,但请尝试删除
“myapp.jar”
.lmfao中的多余空间。谢谢你指出这一点。我确实需要睡一觉。进程会被终止吗?请注意,您的代码不会显示命令执行的所有输出。您实际上只打印了第一行。@EmreDalkiran是的,它成功了