猿问

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

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


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


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");也不会抛出异常,我能做什么做?


猛跑小猪
浏览 254回答 2
2回答

杨__羊羊

您正在启动进程,但没有读取它们的输出或返回状态(甚至在等待它们完成),因此您的代码实际上不会以任何方式对您启动的进程做出反应。您可能习惯于system在 PHP 或类似系统中,该调用仅在执行的命令完成后才返回。Runtime.exec()不同之处在于您开始该过程,但由您来读取它从Process返回的输出中的输出。所以p实际上并不代表崇高,但它是正在执行的过程pidof,您必须阅读其输出才能获得所需的信息。

白猪掌柜的

当然有一个过程;'pidof someRandomGarbage' 仍然是一个运行的应用程序。应用程序在运行时返回“nope”这一事实并不会神奇地使进程消失。您必须使用Process类的方法来确定运行的结果pidof someRandomGarbage。p.exitValue()可能就是你要找的。要确定您必须使用的实际输出p.getInputStream()。请注意,使用相对路径是一个非常糟糕的主意;这意味着您依赖于 PATH 变量和java 正确解析它。尝试/usr/bin/pkill,或可配置的东西。
随时随地看视频慕课网APP

相关分类

Java
我要回答