6

我需要写一个代码

  1. 运行unix进程Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
  2. 通过从 java 代码中执行命令来查找进程的 PIDlsof -t -i: MYPORT
  3. 并通过 pid 杀死他kill -9 PID(也可以通过从 java 代码执行命令)
  4. 然后执行其他命令

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

我怎样才能只杀死我从代码运行的进程?

PS也许我应该使用 ProcessBuilder ?

4

3 回答 3

12

您可以使用以下命令终止从 java 应用程序启动的子进程destroy

Process p = Runtime.getRuntime().exec("java -jar MyServerRunner -port MYPORT");
p.destroy();

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

于 2013-08-04T21:05:26.727 回答
1

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

因此,您的进程已被终止,但 android 应用程序仍然存在。

于 2014-05-14T03:36:36.667 回答
1

您可以在 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));
于 2017-04-19T08:15:59.600 回答