`
snoopy7713
  • 浏览: 1147732 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

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

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

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

工具代码:

Java代码  收藏代码
  1. /**  
  2.  * Process ID in Java  
  3.  *   
  4.  * @author lichengwu  
  5.  * @created 2012-1-18  
  6.  *   
  7.  * @version 1.0  
  8.  */   
  9. public   final   class  PID {  
  10.   
  11.     private   static   final  Log log = LogFactory.getLog(PID. class );  
  12.   
  13.     /**  
  14.      * 私有构造方法  
  15.      */   
  16.     private  PID() {  
  17.         super ();  
  18.     }  
  19.   
  20.     /**  
  21.      * 获得java进程id  
  22.      *   
  23.      * @author lichengwu  
  24.      * @created 2012-1-18  
  25.      *   
  26.      * @return java进程id  
  27.      */   
  28.     public   static   final  String getPID() {  
  29.         String pid = System.getProperty("pid" );  
  30.         if  (pid ==  null ) {  
  31.             RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();  
  32.             String processName = runtimeMXBean.getName();  
  33.             if  (processName.indexOf( '@' ) != - 1 ) {  
  34.                 pid = processName.substring(0 , processName.indexOf( '@' ));  
  35.             } else  {  
  36.                 pid = getPIDFromOS();  
  37.             }  
  38.             System.setProperty("pid" , pid);  
  39.         }  
  40.         return  pid;  
  41.     }  
  42.   
  43.     /**  
  44.      * 从操作系统获得pid  
  45.      * <p>  
  46.      * 对于windows,请参考:http://www.scheibli.com/projects/getpids/index.html  
  47.      *   
  48.      * @author lichengwu  
  49.      * @created 2012-1-18  
  50.      *  
  51.      * @return  
  52.      */   
  53.     private   static  String getPIDFromOS() {  
  54.   
  55.         String pid = null ;  
  56.   
  57.         String[] cmd = null ;  
  58.   
  59.         File tempFile = null ;  
  60.   
  61.         String osName = ParameterUtil.getParameter(Parameter.OS_NAME);  
  62.         // 处理windows   
  63.         if  (osName.toLowerCase().contains( "windows" )) {  
  64.             FileInputStream fis = null ;  
  65.             FileOutputStream fos = null ;  
  66.   
  67.             try  {  
  68.                 // 创建临时getpids.exe文件   
  69.                 tempFile = File.createTempFile("getpids" ".exe" );  
  70.                 File getpids = new  File(ParameterUtil.getResourcePath( "getpids.exe" ));  
  71.                 fis = new  FileInputStream(getpids);  
  72.                 fos = new  FileOutputStream(tempFile);  
  73.                 byte [] buf =  new   byte [ 1024 ];  
  74.                 while  (fis.read(buf) != - 1 ) {  
  75.                     fos.write(buf);  
  76.                 }  
  77.                 // 获得临时getpids.exe文件路径作为命令   
  78.                 cmd = new  String[] { tempFile.getAbsolutePath() };  
  79.             } catch  (FileNotFoundException e) {  
  80.                 log.equals(e);  
  81.             } catch  (IOException e) {  
  82.                 log.equals(e);  
  83.             } finally  {  
  84.                 if  (tempFile !=  null ) {  
  85.                     tempFile.deleteOnExit();  
  86.                 }  
  87.                 Closer.close(fis, fos);  
  88.             }  
  89.         }  
  90.         // 处理非windows   
  91.         else  {  
  92.             cmd = new  String[] {  "/bin/sh" "-c" "echo $$ $PPID"  };  
  93.         }  
  94.         InputStream is = null ;  
  95.         ByteArrayOutputStream baos = null ;  
  96.         try  {  
  97.             byte [] buf =  new   byte [ 1024 ];  
  98.             Process exec = Runtime.getRuntime().exec(cmd);  
  99.             is = exec.getInputStream();  
  100.             baos = new  ByteArrayOutputStream();  
  101.             while  (is.read(buf) != - 1 ) {  
  102.                 baos.write(buf);  
  103.             }  
  104.             String ppids = baos.toString();  
  105.             // 对于windows参考:http://www.scheibli.com/projects/getpids/index.html   
  106.             pid = ppids.split(" " )[ 1 ];  
  107.         } catch  (Exception e) {  
  108.             log.error(e);  
  109.         } finally  {  
  110.             if  (tempFile !=  null ) {  
  111.                 tempFile.deleteOnExit();  
  112.             }  
  113.             Closer.close(is, baos);  
  114.         }  
  115.         return  pid;  
  116.     }  

分享到:
评论

相关推荐

    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