原创地址: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; } }
相关推荐
在Java编程环境中,获取指定进程ID是一项常见的任务,特别是在管理和监控系统资源时。要实现这一功能,我们需要了解Java中的相关API以及操作系统级别的交互。本文将深入探讨如何在Java中获取指定进程的ID,并提供...
2. **跨平台兼容性**: - 上述示例代码仅适用于Windows系统。如果需要支持Linux或macOS等其他操作系统,可以考虑使用条件语句选择不同的命令。 - Linux下可使用`pkill`命令替代`taskkill`。 3. **安全性和性能...
Sigar是一个跨平台的系统监视接口,它提供了统一的API来获取操作系统相关的各种信息,包括但不限于CPU负载、内存使用、进程管理等。Sigar支持Windows、Linux等多种操作系统,是进行系统级监控的理想选择之一。 ####...
`dataProcess`类用于封装从本地方法返回的进程信息,包括进程文件名(`fileName`)、进程ID(`PProcessID`)、当前线程数(`currentThread`)和进程优先级(`classBase`)。这些属性可以通过提供的getter和setter方法进行...
这种方法涉及到复杂的跨平台编程,不是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...
此外,对于跨平台的解决方案,可以使用开源的libproc库(如Python的`psutil`库)或者Java的`jps`工具,它们封装了上述操作系统的特定接口,提供了一致的API来获取进程信息。 在实际编程中,为了保证程序的稳定性和...
【Java编写的Windows任务管理器】是一款利用Java编程语言实现的、...通过学习和分析这个程序,开发者可以深化对Java语言、UI设计以及系统管理的理解,同时也能掌握如何在Java中实现跨平台的进程管理和性能监控功能。
4. **进程ID获取**:在Java中,获取进程ID并不直接,通常需要依赖于系统命令(如`jps`或`pgrep`在Linux,`tasklist`在Windows)。 5. **信号处理**:在Linux中,可以发送不同的信号(如SIGINT, SIGTERM, SIGKILL)...
主要功能是在 Linux 系统下获取所有联网进程的相关信息,包括进程ID(PID)、使用的网络端口、CPU占用率、内存占用量以及进程的命令行参数。 在 Linux 系统中,了解和管理进程是系统管理员的重要工作之一,而网络...
- 使用`psutil`库:这是一个跨平台的库,提供了许多与进程和系统监控相关的功能。可以通过`psutil.Process()`尝试创建一个进程对象,如果进程不存在,会抛出`NoSuchProcess`异常。 - 使用`os`库:在Unix-like系统...
JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android系统中,JNI被广泛应用于系统级服务、性能关键的模块以及与硬件设备的交互。本篇文章将深入探讨如何...
2. **定位Java进程**: 在显示的进程中找到Java进程对应的PID(Process ID)。 3. **查看详细信息**: 可以通过`top -H -p <PID>`来查看该进程的详细信息,其中`-H`表示按线程查看,`-p`后面跟的是Java进程的PID。 ##...
此外,Java 1.5以后引入的`java.lang.Process`接口提供了更多与子进程交互的方法,如获取进程ID、关闭输入/输出流、等待进程结束等。这些功能使得Java程序可以更好地控制和监控外部命令的执行。 总结来说,Java通过...
对于跨平台的解决方案,`libproc`库(如在C或C++中使用)或.NET框架的`System.Diagnostics.Process`类提供了一致的方式来获取进程信息,虽然具体实现会因操作系统不同而有所差异。 总的来说,获取进程状态涉及操作...
OpenCV是一个广泛使用的计算机视觉库,它提供了跨平台的API,包括Java,用于处理图像和视频数据。对于Mac上的x86 64位处理器,我们需要下载适用于该平台的OpenCV库,并将其集成到Java项目中。 1. **集成OpenCV**:...
Sigar(System Information Gatherer and Reporter)是一款强大的跨平台系统信息收集库,它提供了一种统一的方式来获取操作系统级别的信息,包括但不限于主机名、IP地址、网络接口、进程详情、内存状态以及CPU使用...
USB4Java-javax的核心目标是符合JSR 80(Java API for USB)规范,这是一个Java社区进程(Java Community Process)制定的标准,旨在为Java环境提供统一的USB编程接口。通过javax.usb接口,开发者可以进行枚举USB...
8. **跨平台兼容**:不同的操作系统(如Linux、Windows、macOS等)对进程管理有不同的API,监控代码应考虑跨平台兼容性,或者为不同平台编写特定的适配层。 9. **多进程管理**:在多进程环境中,监控代码不仅要关注...
这个库跨平台,提供了获取进程信息的简洁接口,包括进程名、PID、内存使用情况等。 以下是使用Python和`psutil`库的一个简单示例: ```python import psutil for proc in psutil.process_iter(['name', 'exe', '...