使用Java杀死进程

Jee*_*hah 62 java process

我想知道如何"杀死"一个已启动的进程.我知道Process API,但我不确定,如果我可以使用它来"杀死"已经运行的进程,例如firefox.exe等.如果可以使用Process API,请指点我进入正确的方向?如果没有,其他可用选项有哪些?谢谢.

Lak*_*gha 58

在Windows上,您可以使用此命令

taskkill /F /IM <processname>.exe 
Run Code Online (Sandbox Code Playgroud)

强行杀死它.所以它会

Runtime.getRuntime().exec("taskkill /F /IM <processname>.exe")
Run Code Online (Sandbox Code Playgroud)


Yoh*_*age 54

如果从Java应用程序中启动进程(例如,通过调用Runtime.exec()ProcessBuilder.start()),那么您有一个对它的有效Process引用,并且您可以destroy()Process类中调用该方法来终止该特定进程.

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

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


chr*_*hro 31

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

您可以使用与系统相关的命令

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

  • 对于linux,我使用了"pkill firefox" (7认同)
  • "kill -9" 并不总是一个好主意,因为它不会给被杀死的进程一个干净利落的机会。 (2认同)

Xav*_*hot 11

使用Java 9,我们可以使用ProcessHandle,它可以更轻松地识别和控制本机进程:

ProcessHandle
  .allProcesses()
  .filter(p -> p.info().commandLine().map(c -> c.contains("firefox")).orElse(false))
  .findFirst()
  .ifPresent(ProcessHandle::destroy)
Run Code Online (Sandbox Code Playgroud)

其中“firefox”是要杀死的进程。

这个:

  • 首先列出系统上运行的所有进程作为 Stream<ProcessHandle>

  • 延迟过滤此流以仅保留其启动的命令行包含“firefox”的进程。两者commandLinecommand都可以使用,具体取决于我们希望如何检索进程。

  • 查找第一个满足过滤条件的过滤进程。

  • 如果至少一个进程的命令行包含“firefox”,则使用destroy.

不需要导入,因为它ProcessHandlejava.lang.