如何获得我的Java进程的id ?
我知道有一些平台相关的黑客,但我更喜欢一个更通用的解决方案。
如何获得我的Java进程的id ?
我知道有一些平台相关的黑客,但我更喜欢一个更通用的解决方案。
当前回答
我发现了一个可能有点极端的解决方案,除了Windows 10之外,我没有在其他操作系统上尝试过,但我认为它值得注意。
如果您发现自己使用J2V8和nodejs,那么可以运行一个简单的javascript函数,返回java进程的pid。
这里有一个例子:
public static void main(String[] args) {
NodeJS nodeJS = NodeJS.createNodeJS();
int pid = nodeJS.getRuntime().executeIntegerScript("process.pid;\n");
System.out.println(pid);
nodeJS.release();
}
其他回答
这取决于你从哪里寻找信息。
如果要从控制台查找信息,可以使用jps命令。该命令的输出类似于Unix ps命令,并随JDK一起提供,因为我相信是1.5版本
如果从流程的角度来看,RuntimeMXBean(正如Wouter Coekaerts所说)可能是您的最佳选择。在使用Sun JDK 1.6 u7的Windows上,getName()的输出格式为[PROCESS_ID]@[MACHINE_NAME]。然而,你可以尝试执行jps并解析结果:
String jps = [JDK HOME] + "\\bin\\jps.exe";
Process p = Runtime.getRuntime().exec(jps);
如果运行时没有选项,输出应该是进程id后跟进程名。
您可以使用JNA。不幸的是,目前还没有通用的JNA API来获取当前的进程ID,但每个平台都非常简单:
窗户
确保你有jna-platform.jar然后:
int pid = Kernel32.INSTANCE.GetCurrentProcessId();
Unix
声明:
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int getpid ();
}
然后:
int pid = CLibrary.INSTANCE.getpid();
Java 9
在Java 9中,新的进程API可用于获取当前进程ID。首先获取当前进程的句柄,然后查询PID:
long pid = ProcessHandle.current().pid();
这是我有类似需求时使用的。这将正确地确定Java进程的PID。让您的java代码在预定义的端口号上生成服务器,然后执行操作系统命令找出在端口上侦听的PID。Linux
netstat -tupln | grep portNumber
我知道这是一个旧线程,但我想要调用用于获取PID的API(以及在运行时对Java进程的其他操作)正在添加到JDK 9中的process类:http://openjdk.java.net/jeps/102
自Java 9以来,有一个方法process . getpid(),它返回进程的本机ID:
public abstract class Process {
...
public long getPid();
}
要获取当前Java进程的进程ID,可以使用ProcessHandle接口:
System.out.println(ProcessHandle.current().pid());