使用Java来杀死一个进程

我想知道如何“杀死”已经启动的进程。 我知道过程API,但我不知道,如果我可以用它来“杀死”一个已经运行的进程,如firefox.exe等。如果过程API可以使用,请你指点我正确的方向? 如果没有,其他可用的选项是什么? 谢谢。

如果从Java应用程序中启动进程(例如调用Runtime.exec()ProcessBuilder.start() ),那么您有一个有效的Process引用,您可以调用Process类中的destroy()方法杀死那个特定的进程。

但请注意,如果您调用的进程创build新的subprocess,则这些进程可能不会被终止(请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 )。

另一方面,如果你想杀死外部进程(你没有从你的Java应用程序产生),那么你可以做的一件事就是调用O / S实用程序,允许你这样做。 例如,你可以在Unix / Linux下的kill命令上运行Runtime.exec() ,并检查返回值以确保应用程序被终止(0表示成功,-1表示错误)。 但是,这当然会使您的应用程序平台依赖。

在Windows中,你可能不得不使用这个命令

 taskkill /F /IM <processname>.exe 

有力地杀了它。 所以会的

 Runtime.getRuntime().exec("taskkill /F /IM <processname>.exe") 

AFAIU java.lang.Process是java本身创build的进程(如Runtime.exec('firefox'))

你可以使用像系统相关的命令

  Runtime rt = Runtime.getRuntime(); if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) rt.exec("taskkill " +....); else rt.exec("kill -9 " +....); 

无意中我偶然发现了另一种在Unix上执行强制终止的方法(对于那些使用Weblogic的人)。 这比通过Runtime.exec()运行/ bin / kill -9更便宜,更优雅。

 import weblogic.nodemanager.util.Platform; import weblogic.nodemanager.util.ProcessControl; ... ProcessControl pctl = Platform.getProcessControl(); pctl.killProcess(pid); 

如果你很难得到pid,你可以在java.lang.UNIXProcess上使用reflection,例如:

 Process proc = Runtime.getRuntime().exec(cmdarray, envp); if (proc instanceof UNIXProcess) { Field f = proc.getClass().getDeclaredField("pid"); f.setAccessible(true); int pid = f.get(proc); } 

这可能是java解释器的缺陷,但是HPUX上的java不会执行kill -9,而只会导致kill -TERM。

我做了一个小testingtestDestroy.java:

 ProcessBuilder pb = new ProcessBuilder(args); Process process = pb.start(); Thread.sleep(1000); process.destroy(); process.waitFor(); 

和调用:

 $ tusc -f -p -s signal,kill -e /opt/java1.5/bin/java testDestroy sh -c 'trap "echo TERM" TERM; sleep 10' 

10s后死亡(不是像预期的那样1s后死亡),并显示:

 ... [19999] Received signal 15, SIGTERM, in waitpid(), [caught], no siginfo [19998] kill(19999, SIGTERM) ............................................................................. = 0 ... 

在窗户上做同样的事情似乎杀死过程罚款,即使信号处理(但这可能是由于窗户不使用信号破坏)。

其实我发现Linux的相关线程和openjava实现的Java – Process.destroy()源代码似乎也使用-TERM,这似乎是非常错误的。

尝试一下:

  String command = "killall <your_proccess>"; Process p = Runtime.getRuntime().exec(command); p.destroy(); 

如果该过程仍然存在,请添加:

  p.destroyForcibly();