如何在Windows机器上的Java程序获得给定进程的PID而不使用JNA

时间:2017-03-09 09:57:52

标签: windows jna pid

我想使用以下命令行终止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);

3 个答案:

答案 0 :(得分: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();
 }               
}

希望它会对你有所帮助。

答案 1 :(得分:0)

正如您所发现的,您可以通过命令行wmic使用WMI,但您也可以use the tasklist command

需要多个开关来过滤输出。

答案 2 :(得分:0)

由于问题的标签中有 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;
}