通过Java代码检查进程是否在Linux上运行

时间:2018-10-05 12:44:24

标签: java linux

问题是我只想在进程运行时才杀死它,否则我想做其他事情。

这是我现在的代码(以崇高为例):

try {
    Process p = Runtime.getRuntime().exec("pidof sublime_text");

    if (p != null){
        Runtime.getRuntime().exec("pkill -f sublime");
    }
}
catch (Exception e) {
    System.out.println(e.getMessage());
}

Runtime.getRuntime().exec("pidof sublime_text");总是返回一个进程,即使这个进程不存在,我的意思是,我可以执行:Runtime.getRuntime().exec("pidof nonExistingProcess");,这仍然会返回一个没有错误的进程,然后执行kill“ pkill ”命令  Runtime.getRuntime().exec("pkill -f nonExistingProcess");也不抛出异常,我该怎么办?

2 个答案:

答案 0 :(得分:1)

您正在启动进程,但没有读取它们的输出或返回状态(甚至没有等待它们完成),因此您的代码实际上对启动的进程没有任何反应。

在PHP或类似的系统中,您可能会习惯system,在该系统中,只有在执行完命令后该调用才会返回。 Runtime.exec()的不同之处在于,您开始该过程,但要由您决定要读取返回的Process的输出。

因此p实际上并不代表崇高的意思,但这是执行pidof的过程,您必须阅读其输出以获取所需的信息。

答案 1 :(得分:0)

当然有一个过程; “ pidof someRandomGarbage”仍然是一个正在运行的应用程序。如果应用程序运行,则返回“ nope”,这一事实并不能使进程消失。您必须使用Process类的方法来确定运行pidof someRandomGarbage的结果。 p.exitValue()可能就是您想要的。要确定实际输出,您必须使用p.getInputStream()

请注意,使用相对路径是一个非常糟糕的主意;这意味着您依赖于PATH变量来正确解析它。尝试/usr/bin/pkill或其他可配置的东西。