首先是获取当前Java运行的Java进程ID,这个是网上常见的,也就是Java程序自身将进程ID打印出来:
package com.test; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; public class Target { public static void main(String[] args) throws InterruptedException { System.out.println(getProcessID()); while(true) { Thread.sleep(10000); } } public static final int getProcessID() { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); System.out.println(runtimeMXBean.getName()); return Integer.valueOf(runtimeMXBean.getName().split("@")[0]) .intValue(); } }
运行结果:
2896@PC-20150603VRPL 2896
ManagementFactory是一个在运行时管理和监控Java VM的工厂类,它能提供很多管理VM的静态接口,比RuntimeMXBean;
RuntimeMXBean是Java虚拟机的运行时管理接口.
当前进程ID为2896。
但这种让Java进程自行打印ID的方式并不太好用,因为很多时候我们是需要在不修改代码另一个Java程序代码的情况下知道这个正在运行着的Java进程的ID,如果你也有这个需求,可以看一下下面的解决方法:
获取所有正在运行着的Java进程
package com.test; import java.util.HashSet; import java.util.Set; import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.MonitoredVm; import sun.jvmstat.monitor.MonitoredVmUtil; import sun.jvmstat.monitor.VmIdentifier; public class ProcessID { public static void main(String[] args) throws Exception { // 获取监控主机 MonitoredHost local = MonitoredHost.getMonitoredHost("localhost"); // 取得所有在活动的虚拟机集合 Set<?> vmlist = new HashSet<Object>(local.activeVms()); // 遍历集合,输出PID和进程名 for(Object process : vmlist) { MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process)); // 获取类名 String processname = MonitoredVmUtil.mainClass(vm, true); System.out.println(process + " ------> " + processname); } } }
运行结果:
2752 ------> 5172 ------> com.test.Target 5308 ------> com.test.ProcessID
这样,就可以根据类名找到进程号了。
MonitoredHost等类位于${JAVA_HOME}/lib/tools.jar
下面是一个可以直接根据类找到对应Java进程ID的方法:
package com.test; import java.net.URISyntaxException; import java.util.HashSet; import java.util.Set; import sun.jvmstat.monitor.MonitorException; import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.MonitoredVm; import sun.jvmstat.monitor.MonitoredVmUtil; import sun.jvmstat.monitor.VmIdentifier; public class ProcessID { public static void main(String[] args) throws Exception { int pid = getProcess(Target.class); System.out.println("PID: "+pid); } public static int getProcess(Class<?> cls) throws MonitorException, URISyntaxException { if(cls == null) { return -1; } // 获取监控主机 MonitoredHost local = MonitoredHost.getMonitoredHost("localhost"); // 取得所有在活动的虚拟机集合 Set<?> vmlist = new HashSet<Object>(local.activeVms()); // 遍历集合,输出PID和进程名 for(Object process : vmlist) { MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process)); // 获取类名 String processname = MonitoredVmUtil.mainClass(vm, true); if(cls.getName().equals(processname)) { return ((Integer)process).intValue(); } } return -1; } }
运行结果:
PID: 5172
源码位于我的Github项目aoptracer的com.test包里
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: 我正在服务器上运行一个nohup进程。当我尝试杀死它时,我的油灰控制台会关闭。 这是我尝试查找进程ID的方法: 这是杀死的命令 问题答案: 使用并将任务放在后台时,后台运算符()将在命令提示符下为您提供PID。如果您的计划是手动管理该进程,则可以保存该PID,然后在需要时通过或(如果需要强制终止)将其用于终止该进程。或者,您可以稍后找到PID,然后从那里找到PID。请注意,关键字/命令
问题内容: 我从shell脚本启动了一个后台进程,我想在脚本结束后终止该进程。 如何从我的shell脚本中获取此过程的PID?据我所知,变量包含当前脚本的PID,而不是后台进程。 问题答案: 您需要在启动时保存后台进程的PID: 您不能使用作业控制,因为它是一种交互式功能,并且与控制终端绑定在一起。脚本完全不必附加终端,因此作业控制不一定可用。
问题内容: 我以这种方式创建子流程: 如何获取该子进程ID? PS我正在Linux上工作。 问题答案: 仍然没有为此的公共API(请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244896),但是有解决方法。 第一个解决方法是使用像这样的外部程序,并使用来调用它以获得pid :) 另一个基于以下事实:该类是抽象的,并且实际上根据您的平
问题内容: 我想在Windows中杀死特定的Java进程,例如在Linux中(获取processid然后杀死该进程)。 问题答案: 您可以使用JRE中包含的实用程序来查找Java进程的进程ID。输出将显示可执行JAR文件的名称或主类的名称。 然后使用Windows任务管理器终止该过程。如果要在命令行上执行此操作,请使用
问题内容: 如何获取Java进程的ID? 我知道有几种与平台相关的黑客,但是我希望有一个更通用的解决方案。 问题答案: 看起来是最好的(最近的)解决方案。它很短,并且可能在广泛使用的所有实现中起作用。 在上,它返回一个类似(12345是进程ID)的值。但是请注意,根据docs,不能保证该值: 返回代表正在运行的Java虚拟机的名称。返回的名称字符串可以是任意字符串,并且Java虚拟机实现可以选择在
问题内容: 我知道我可以像这样获得流程的使用子流程: 但是我只想知道要写入进程的pid,我该 怎么做? 问题答案: 只需写信给: