【问题标题】:How can Java program on windows machine get a PID of a given process without using JNAWindows机器上的Java程序如何在不使用JNA的情况下获取给定进程的PID
【发布时间】:2017-03-09 09:57:52
【问题描述】:

我想用下面的命令行杀死 Window 中的特定 Java 进程:

taskkill /f /pid <my_pid>

在不使用 JNA api 的情况下,我没有找到在 Windows 上获取进程 pid 的方法。 我找到了几个使用 JNA 的答案,但我正在寻找更简单的解决方案。

以下是我使用的 Java 代码(不起作用):

   Field f = p.getClass().getDeclaredField("handle");
   f.setAccessible(true);
   long handle = f.getLong(p);
   System.out.println("Kill pid " + handle);

【问题讨论】:

标签: windows jna pid


【解决方案1】:

终于找到了解决办法。 我已经使用wmic process get commandline, processid windows 命令来获取 PID。

下面是我的 Killer.java :

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Killer {


public static void main(String[] args) throws Exception {



    ArrayList<String> cmds = new ArrayList<String>();

    cmds.add("wmic");
    cmds.add("process");
    cmds.add("get");
    cmds.add("commandline,processid");

    ProcessBuilder pb = new ProcessBuilder(cmds);

    Process p = pb.start();

    //p.waitFor();


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

    String line;
    int pid=0;

    while((line = rd.readLine()) != null)
    {
        if(line.contains(args[0]) && !line.contains("Killer"))
        {

            System.out.println("OK" + line);
            String[] split = line.split(" ");
            pid=Integer.parseInt(split[split.length - 1]);

        }
        else
        {
            //System.out.println("  " + line);
        }
    }

    cmds = new ArrayList<String>();

    System.out.println("Kill pid " + pid);
    cmds.add("taskkill");
    cmds.add("/T");
    cmds.add("/F");
    cmds.add("/PID");
    cmds.add("" + pid);
    pb = new ProcessBuilder(cmds);
    pb.start();
 }               
}

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    如您所见,您可以通过命令行wmic 使用 WMI,但也可以通过use the tasklist command 使用。

    过滤输出需要几个开关。

    【讨论】:

    • 但是你怎么知道你必须杀死列表中的哪个进程呢?
    • 与使用 WMI 的方式相同,您可以通过 ImageName(程序,如 tasklist.exe)或其他字段进行搜索。我在您的原始帖子的评论中发布了一个特定示例,其中显示了语法。虽然tasklist 只会列出它,但您可以使用类似的语法(略有不同的开关)直接使用taskkill 命令进行过滤。如果匹配其他字段,您甚至不必匹配 PID。
    【解决方案3】:

    由于问题的标签中有jna,这也是一种兼容JNA的方法...

    int pid;
    try {
        pid = Kernel32.INSTANCE.GetCurrentProcessId();
    }
    catch(UnsatisfiedLinkError | NoClassDefFoundError e) {
        log.warn("Could not obtain process ID.  This usually means JNA isn't working.  Returning -1.");
        pid = -1;
    }
    

    ... 或者对于 Unix:

    private interface CLibrary extends Library {
        CLibrary INSTANCE = Native.load("c", CLibrary.class);
        int getpid();
    }
    
    int pid;
    try {
        pid = CLibrary.INSTANCE.getpid();
    }
    catch(UnsatisfiedLinkError | NoClassDefFoundError e) {
        log.warn("Could not obtain process ID.  This usually means JNA isn't working.  Returning -1.");
        pid = -1;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2014-07-11
      • 2011-04-28
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2012-12-31
      相关资源
      最近更新 更多