使用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();