Java:由Runtime.getRuntime()运行的Kill进程.exec()

时间:2013-08-04 21:01:35

标签: java unix process

我需要编写一个代码,

  1. 使用Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
  2. 运行unix进程
  3. 通过执行java代码lsof -t -i: MYPORT
  4. 中的命令查找进程的PID
  5. 并通过pid kill -9 PID(也通过执行java代码中的命令)杀死他
  6. 然后执行其他命令
  7. 但是

    如果我通过Runtime.getRuntime().exec()执行此命令,我的程序将以退出代码137退出 - 这意味着当我运行Runtime.getRuntime().exec("kill -9 PID")时,我会杀死我的java程序的进程,而不是我运行的程序代码。

    如何才能杀死我从代码运行的进程?

    P.S。也许我应该使用ProcessBuilder?

3 个答案:

答案 0 :(得分:11)

您可以使用destroy

来终止从java应用程序启动的子进程
Process p = Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
p.destroy();

另请注意,在单独的线程中运行其他代码而不是在单独的进程中运行可能是有意义的。

答案 1 :(得分:1)

您可以使用.exec("ps|grep <your process name>");,然后解析结果以获取PID,最后.exec("kill PID");

因此,您的进程被杀死但Android应用程序仍处于活动状态。

答案 2 :(得分:0)

你可以在unix中使用反射pid(我知道这是一个坏主意:))并调用kill;

Process proc = Runtime.getRuntime().exec(
   new String[] {"java","-classpath",System.getProperty("java.class.path"),... });
Class<?> cProcessImpl = proc.getClass();
Field fPid = cProcessImpl.getDeclaredField("pid");
if (!fPid.isAccessible()) {
    fPid.setAccessible(true);
}
Runtime.getRuntime().exec("kill -9 " + fPid.getInt(proc));