问题是我只想在进程运行时才杀死它,否则我想做其他事情。
这是我现在的代码(以崇高为例):
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");
也不抛出异常,我该怎么办?
答案 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
或其他可配置的东西。