`
ol_beta
  • 浏览: 289336 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

跨平台获取java进程id(Process ID in Java)

阅读更多

原创地址:http://blog.lichengwu.cn/java/2012/01/18/get-jvm-pid-on-multi-platform/

 

对于不同平台,获取java进程id有不同的方法,这个做一个总结,写一个工具类。

这个工具主要进行两种尝试来获得pid:

  • 从 java.lang.management.RuntimeMXBean获得
  • 从操作系统获得
    • windows系统
    • 非windows系统

工具代码:

/**
 * Process ID in Java
 * 
 * @author lichengwu
 * @created 2012-1-18
 * 
 * @version 1.0
 */
public final class PID {

	private static final Log log = LogFactory.getLog(PID.class);

	/**
	 * 私有构造方法
	 */
	private PID() {
		super();
	}

	/**
	 * 获得java进程id
	 * 
	 * @author lichengwu
	 * @created 2012-1-18
	 * 
	 * @return java进程id
	 */
	public static final String getPID() {
		String pid = System.getProperty("pid");
		if (pid == null) {
			RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
			String processName = runtimeMXBean.getName();
			if (processName.indexOf('@') != -1) {
				pid = processName.substring(0, processName.indexOf('@'));
			} else {
				pid = getPIDFromOS();
			}
			System.setProperty("pid", pid);
		}
		return pid;
	}

	/**
	 * 从操作系统获得pid
	 * <p>
	 * 对于windows,请参考:http://www.scheibli.com/projects/getpids/index.html
	 * 
	 * @author lichengwu
	 * @created 2012-1-18
	 *
	 * @return
	 */
	private static String getPIDFromOS() {

		String pid = null;

		String[] cmd = null;

		File tempFile = null;

		String osName = ParameterUtil.getParameter(Parameter.OS_NAME);
		// 处理windows
		if (osName.toLowerCase().contains("windows")) {
			FileInputStream fis = null;
			FileOutputStream fos = null;

			try {
				// 创建临时getpids.exe文件
				tempFile = File.createTempFile("getpids", ".exe");
				File getpids = new File(ParameterUtil.getResourcePath("getpids.exe"));
				fis = new FileInputStream(getpids);
				fos = new FileOutputStream(tempFile);
				byte[] buf = new byte[1024];
				while (fis.read(buf) != -1) {
					fos.write(buf);
				}
				// 获得临时getpids.exe文件路径作为命令
				cmd = new String[] { tempFile.getAbsolutePath() };
			} catch (FileNotFoundException e) {
				log.equals(e);
			} catch (IOException e) {
				log.equals(e);
			} finally {
				if (tempFile != null) {
					tempFile.deleteOnExit();
				}
				Closer.close(fis, fos);
			}
		}
		// 处理非windows
		else {
			cmd = new String[] { "/bin/sh", "-c", "echo $$ $PPID" };
		}
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		try {
			byte[] buf = new byte[1024];
			Process exec = Runtime.getRuntime().exec(cmd);
			is = exec.getInputStream();
			baos = new ByteArrayOutputStream();
			while (is.read(buf) != -1) {
				baos.write(buf);
			}
			String ppids = baos.toString();
			// 对于windows参考:http://www.scheibli.com/projects/getpids/index.html
			pid = ppids.split(" ")[1];
		} catch (Exception e) {
			log.error(e);
		} finally {
			if (tempFile != null) {
				tempFile.deleteOnExit();
			}
			Closer.close(is, baos);
		}
		return pid;
	}
}
1
0
分享到:
评论
3 楼 ol_beta 2012-01-19  
zk1878 写道
感觉这个String pid = System.getProperty("pid"); 
        if (pid == null) { 
不靠谱, 如果有人蛋疼的写上System.setProperty("pid","123")之类 如何看待;

这是为了方便下次取得pid来缓存的,当然你System.setProperty任何东西,你可以覆盖jvm的属性,版本信息,厂商...关键是,一般人都不会做。
2 楼 zk1878 2012-01-19  
感觉这个String pid = System.getProperty("pid"); 
        if (pid == null) { 
不靠谱, 如果有人蛋疼的写上System.setProperty("pid","123")之类 如何看待;
1 楼 JetMah 2012-01-19  
ParameterUtil?

相关推荐

    java 获取指定的进程id

    在Java编程环境中,获取指定进程ID是一项常见的任务,特别是在管理和监控系统资源时。要实现这一功能,我们需要了解Java中的相关API以及操作系统级别的交互。本文将深入探讨如何在Java中获取指定进程的ID,并提供...

    Java通过进程名称杀进程

    2. **跨平台兼容性**: - 上述示例代码仅适用于Windows系统。如果需要支持Linux或macOS等其他操作系统,可以考虑使用条件语句选择不同的命令。 - Linux下可使用`pkill`命令替代`taskkill`。 3. **安全性和性能...

    java获取各进程的信息

    Sigar是一个跨平台的系统监视接口,它提供了统一的API来获取操作系统相关的各种信息,包括但不限于CPU负载、内存使用、进程管理等。Sigar支持Windows、Linux等多种操作系统,是进行系统级监控的理想选择之一。 ####...

    Java_JNI_获得系统进程信息实例.doc

    `dataProcess`类用于封装从本地方法返回的进程信息,包括进程文件名(`fileName`)、进程ID(`PProcessID`)、当前线程数(`currentThread`)和进程优先级(`classBase`)。这些属性可以通过提供的getter和setter方法进行...

    java创建进程,及根据命令行、pid删除进程

    这种方法涉及到复杂的跨平台编程,不是Java的标准做法。 如果你只是想终止一个由Java程序创建的进程,你可以调用`Process`对象的`destroy()`或`destroyForcibly()`方法。这将发送一个信号给进程,让它终止执行。...

    获取正在运行进程的实例

    Python的`psutil`库则提供了跨平台的方式来获取进程信息: ```python import psutil def print_memory_usage(): for proc in psutil.process_iter(['pid', 'name', 'memory_info']): print(f"进程ID: {proc.info...

    商业编程-源码-如何获取系统进程的命令行.zip

    此外,对于跨平台的解决方案,可以使用开源的libproc库(如Python的`psutil`库)或者Java的`jps`工具,它们封装了上述操作系统的特定接口,提供了一致的API来获取进程信息。 在实际编程中,为了保证程序的稳定性和...

    Java编写的windows任务管理器

    【Java编写的Windows任务管理器】是一款利用Java编程语言实现的、...通过学习和分析这个程序,开发者可以深化对Java语言、UI设计以及系统管理的理解,同时也能掌握如何在Java中实现跨平台的进程管理和性能监控功能。

    java 操作脚本启动服务

    4. **进程ID获取**:在Java中,获取进程ID并不直接,通常需要依赖于系统命令(如`jps`或`pgrep`在Linux,`tasklist`在Windows)。 5. **信号处理**:在Linux中,可以发送不同的信号(如SIGINT, SIGTERM, SIGKILL)...

    in_net_process_list.zip_net process

    主要功能是在 Linux 系统下获取所有联网进程的相关信息,包括进程ID(PID)、使用的网络端口、CPU占用率、内存占用量以及进程的命令行参数。 在 Linux 系统中,了解和管理进程是系统管理员的重要工作之一,而网络...

    判断进程是否存在

    - 使用`psutil`库:这是一个跨平台的库,提供了许多与进程和系统监控相关的功能。可以通过`psutil.Process()`尝试创建一个进程对象,如果进程不存在,会抛出`NoSuchProcess`异常。 - 使用`os`库:在Unix-like系统...

    JNI系统进程列表查询

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android系统中,JNI被广泛应用于系统级服务、性能关键的模块以及与硬件设备的交互。本篇文章将深入探讨如何...

    JAVA性能分析

    2. **定位Java进程**: 在显示的进程中找到Java进程对应的PID(Process ID)。 3. **查看详细信息**: 可以通过`top -H -p &lt;PID&gt;`来查看该进程的详细信息,其中`-H`表示按线程查看,`-p`后面跟的是Java进程的PID。 ##...

    java_dos_shell_bat

    此外,Java 1.5以后引入的`java.lang.Process`接口提供了更多与子进程交互的方法,如获取进程ID、关闭输入/输出流、等待进程结束等。这些功能使得Java程序可以更好地控制和监控外部命令的执行。 总结来说,Java通过...

    得到一个进程的状态,比如:进程是否没有响应

    对于跨平台的解决方案,`libproc`库(如在C或C++中使用)或.NET框架的`System.Diagnostics.Process`类提供了一致的方式来获取进程信息,虽然具体实现会因操作系统不同而有所差异。 总的来说,获取进程状态涉及操作...

    java调用摄像头推流(针对mac系统的x86处理器64位)

    OpenCV是一个广泛使用的计算机视觉库,它提供了跨平台的API,包括Java,用于处理图像和视频数据。对于Mac上的x86 64位处理器,我们需要下载适用于该平台的OpenCV库,并将其集成到Java项目中。 1. **集成OpenCV**:...

    Sigarh获取本机信息

    Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种统一的方式来获取操作系统级别的信息,包括但不限于主机名、IP地址、网络接口、进程详情、内存状态以及CPU使用...

    进程监控代码

    8. **跨平台兼容**:不同的操作系统(如Linux、Windows、macOS等)对进程管理有不同的API,监控代码应考虑跨平台兼容性,或者为不同平台编写特定的适配层。 9. **多进程管理**:在多进程环境中,监控代码不仅要关注...

    usb4java-javax:usb4java的javax.usb扩展

    USB4Java-javax的核心目标是符合JSR 80(Java API for USB)规范,这是一个Java社区进程(Java Community Process)制定的标准,旨在为Java环境提供统一的USB编程接口。通过javax.usb接口,开发者可以进行枚举USB...

    计算机软件-商业源码-实例62 枚举系统正在运行的程序.zip

    这个库跨平台,提供了获取进程信息的简洁接口,包括进程名、PID、内存使用情况等。 以下是使用Python和`psutil`库的一个简单示例: ```python import psutil for proc in psutil.process_iter(['name', 'exe', '...

Global site tag (gtag.js) - Google Analytics