文档章节

Java应用内PID的获取

cwalet
 cwalet
发布于 2013/04/09 16:35
字数 815
阅读 1021
收藏 1
PID

译自:How a Java Application Can Discover its Process ID (PID)

对于某些要与外部进程(非Java)协作的应用,通常需要获取到它自己的进程ID。但是当前的Java API并不提供接口以便直接检索PID(可能需要等到如下问题解决之后425062242448964890847)。

但是聪明的我还是找到五种从Java程序中获取PID的方法:

1.使用Java监控和管理的API(java.lang.management):

ManagementFactory.getRuntimeMXBean().getName();

得到数据类似: 28906@localhost
28906就是JVM进程ID,实际上也是当前应用的PID.

这一招是JVM直接支持的,但是我只在SUN自家的JVM测试过可行.

Java API中关于RuntimeMXBean.getName()方法的描述如下(来自Javadoc):

返回表示正在运行的 Java 虚拟机的名称。返回的名称字符串可以为任何任意字符串,Java 虚拟机实现可以选择在返回的名称字符串中嵌入特定于平台的有用信息。每个正在的运行的虚拟机可以具有不同的名称。

所以即使这个方法是最简便的,也可能因该方法的具体实现改变而导致你的应用无法正常运行.

2.通过shell脚本而非Java属性的方式来启动你的应用如下:

exec java -Dpid=$$ -jar /Applications/bsh-2.0b4.jar

然后在Java里调用这个:

System.getProperty("pid");

3.本博客使用shell脚本的$!设备描述符 - 如果你只是想要创建一个包含pid的文件,那这个方法挺方便~?

4.使用Java本地调用(JNI)- 一个灰常繁琐笨重且受限于平台的解决方案.

5.使用系统变量$PPID和Runtime.exec(String[])方法,在这篇文章中有详细描述.

import java.io.IOException;

public class Pid {
	public static void main(String[] args) throws IOException {
	  byte[] bo = new byte[100];
	  String[] cmd = {"bash", "-c", "echo $PPID"};
	  Process p = Runtime.getRuntime().exec(cmd);
	  p.getInputStream().read(bo);
	  System.out.println(new String(bo));
	}
}

可以说,以上的每一个方法都不好,各有优劣。(下面来一段作者的吐槽~_~)

我知道Sun的最高优先级是Java的跨平台兼容性,但我还是赞成下述在RFE中关于给JDK添加getPid()方法的留言:

求求你Sun,已经4、5年了~给我们PID,真的蒸的很需要,还有……可以一劳永逸的减少开发者们在文档里翻来覆去找寻这个莫须有的方法所浪费的时间~

P.S.

1.注意了,评论中有人说,在Unix系统下每次读取一个文件到内存里都会创建一个新的进程,所以每次运行

Process p = Runtime.getRuntime ().exec(cmd);都会得到一个不同的PID,这是再正常不过的~

2.关于第5点提及的文章中有详细解释:为什么不直接传一个字符串给exec执行呢?原因是Runtime.exec(String) does not parse quotes correctly的bug报告,该方法不能正确解析引号.

以上两点未经本人测试,参考的其他链接如下:

ManagementFactory.getRuntimeMXBean().getName()

该方法返回的是“PID@HOST”,即当前运行JVM进程的ID和主机名。

© 著作权归作者所有

共有 人打赏支持
cwalet
粉丝 44
博文 111
码字总数 87663
作品 0
其他
私信 提问
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

基于Sun HotSpot JVM 这里将介绍几款sun hotspot jvm 自带的监控工具: 请确保java_home/bin配置到path环境变量下,因为这些工具都在jdk的bin目录下 jps(JVM Process Status Tool):JVM机进程...

我类个擦
2014/09/12
0
1
跟我学习dubbo-在Linux操作系统上手工部署Dubbo服务(5)

在Linux操作系统上手工部署Dubbo服务 1、环境变量配置 Java环境变量----只需要JRE vi /etc/profile ## java env export JAVA_HOME=/usr/local/java/jdk1.7.0_72 export JRE_HOME=$JAVA_HOME......

HI曲奇饼干
2016/01/09
153
1
JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解

是什么 jps 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 我自己也用PS,即:ps -ef | grep java jstack 观察jvm中当前所有线程的运行情况和线程当前状态。 系统崩溃了?如果java程...

xionghuiCoder
2015/08/13
0
0
JVM:查看java内存情况命令

jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...

BazingaYou
2013/11/15
0
0
jvm优化必知系列——监控工具

这是jvm优化系列第二篇: jvm优化——垃圾回收 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具,有了理论指导,定位问题的时候,知...

wier
2017/10/18
0
14

没有更多内容

加载失败,请刷新页面

加载更多

day176-2018-12-13-英语流利阅读-待学习

人造的肉你敢吃吗? Lala 2018-12-13 1.今日导读 在过去的几十年里,肉类替代品已经从简单的大豆制品进化成了更像肉类的东西,比如以植物为原料的汉堡。然而,最近有公司已经生产出了完全用动...

飞鱼说编程
6分钟前
0
0
mysql 按小时统计

表里记录了有时间戳和对应的当年登录的玩家数量,现在希望看到一个月内每个小时,登录玩家的平均数量。 之前是写的一个脚本,写了一个循环,每次获取一个小时的平均数,放在数组里,再导出文...

bobway
11分钟前
1
0
TiQuery:All Diagnosis in SQL | TiDB Hackathon 优秀项目分享

本文作者是来自 TiNiuB 队的黄梦龙同学,他们的项目 TiQuery 在本届 TiDB Hackathon 2018 中获得了三等奖。 TiQuery 可以搜集诊断集群问题所需要的信息,包括集群拓扑,Region 分布,配置,各...

TiDB
22分钟前
2
0
git 分支创建合并流程图

gentlelions
31分钟前
3
0
Kali Linux常用服务配置教程DHCP服务原理

Kali Linux常用服务配置教程DHCP服务原理 动态主机配置协议(Dynamic Host Configuration Protocol,简称DHCP)是一个局域网的网络协议,基于UDP协议工作。它主要有两个用途:第一,给内部网...

大学霸
32分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部