Java 机器上的 windows 程序如何在不使用 JNA 的情况下获取给定进程的 PID
How can Java program on windows machine get a PID of a given process without using JNA
我想使用以下命令行终止 Window 中的特定 Java 进程:
taskkill /f /pid <my_pid>
我没有找到在 windows 上不使用 JNA api 获取进程 pid 的方法。
我找到了几个使用 JNA 的答案,但我正在寻找更简单的解决方案。
以下是我使用的 Java 代码(不起作用):
Field f = p.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handle = f.getLong(p);
System.out.println("Kill pid " + handle);
终于找到解决办法了。
我已经使用 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();
}
}
希望对您有所帮助。
如您所见,您可以通过命令行使用 WMI wmic
,但您也可以 use the tasklist
command。
过滤输出需要几个开关。
由于问题在标签中有 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;
}
我想使用以下命令行终止 Window 中的特定 Java 进程:
taskkill /f /pid <my_pid>
我没有找到在 windows 上不使用 JNA api 获取进程 pid 的方法。 我找到了几个使用 JNA 的答案,但我正在寻找更简单的解决方案。
以下是我使用的 Java 代码(不起作用):
Field f = p.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handle = f.getLong(p);
System.out.println("Kill pid " + handle);
终于找到解决办法了。
我已经使用 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();
}
}
希望对您有所帮助。
如您所见,您可以通过命令行使用 WMI wmic
,但您也可以 use the tasklist
command。
过滤输出需要几个开关。
由于问题在标签中有 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;
}