Java中根据PID终止进程

7
我目前有如下内容:
public static void main(String[] args) {

    try {
        String line;
        Process p = Runtime.getRuntime().exec(
                System.getenv("windir") + "\\system32\\" + "tasklist.exe");

        BufferedReader input = new BufferedReader(new InputStreamReader(
                p.getInputStream()));

        while ((line = input.readLine()) != null) {
            System.out.println(line); // <-- Parse data here.
        }
        input.close();
    } catch (Exception err) {
        err.printStackTrace();
    }

    Scanner killer = new Scanner(System.in);

    int tokill;

    System.out.println("Enter PID to be killed: ");

    tokill = killer.nextInt();

}

我希望能够根据用户输入的PID来终止一个进程。我该如何做?(仅需要在Windows上工作)。*注意:必须能够结束任何进程,包括系统进程,因此如果使用taskkill.exe进行操作,则可能需要-F标志。

因此,如果我有

Runtime.getRuntime().exec("taskkill /F /PID 827");

我该如何用我的tokill变量替换“827”?


2
这个问题已经被解决了几次。您的情况是否有特殊要求?a few times - Eric Grunzke
@EricGrunzke 幸运的链接点击?不错 :) - Aquarius Power
4个回答

9

只需构建字符串即可终止进程:

String cmd = "taskkill /F /PID " + tokill;
Runtime.getRuntime().exec(cmd);

2
我现在没有坐在Windows电脑前。但是如果tasklist适用于您,您可以使用ProcessBuilder来运行Windows命令taskkill。像这样使用ProcessBuilder实例调用taskkillcmd /c taskkill /pid %pid%(将%pid%替换为实际的pid)。您不需要两个可执行文件的绝对路径,因为c:/windows/system32在路径变量中。
正如Eric在评论中指出的那样,已经有很多人提供了这个答案。

1
String cmd = "taskkill /F /T /PID " + tokill;
Runtime.getRuntime().exec(cmd);

如果您使用的是Windows系统,请使用taskkill命令。

您可能需要使用/T选项来关闭所有生成的子进程。


1
JavaSysMon库可以胜任此任务,并且具有多平台的优点:https://github.com/danielflower/javasysmon (原版的分支,这个版本有一个方便的Maven构件)
private static final JavaSysMon SYS_MON = new JavaSysMon();

// There is no way to transform a [Process] instance to a PID in Java 8. 
// The sysmon library does let you iterate over the process table.
// Make the filter match some identifiable part of your process and it should be a good workaround
int pid = Arrays.stream(SYS_MON.processTable())
    .filter(p -> p.getName().contains("python"))
    .findFirst().get().getPid()

// Kill the process
SYS_MON.killProcess(pid);
// Kill the process and its children, or only the children
SYS_MON.killProcessTree(pid, descendentsOnly);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接