`

wmic command executed in Java blocked

 
阅读更多

在Java执行下面的windows的wmic命令时,

wmic cpu get loadpercentage /value
wmic os get totalvisiblememorysize,freephysicalmemory /value
wmic process where(name="java.exe") get name,creationdate,workingsetsize,pagefileusage /value

遇到了从Process的InputStream中读执行结果时,程序阻塞在读的语句处,如下代码所示:

 

ProcessBuilder pb = new ProcessBuilder("wmic",...);  
// pb.redirectErrorStream(true);   // 注释代码1
Process p = pb.start(); 
// p.getOutputStream().close();    // 注释代码2
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));  
String tmp = null;  
  
while ((tmp = br.readline()) != null) {    //阻塞代码处
    System.out.println(tmp);  
}  
int exitValue = p.waitfor();

通过google,Java method calls the WMIC command提到根据操作系统的不同,每个Process的InputStream的大小不等,当InputStream没有足够的空间来保存执行结果时,执行结果会输出到ErrorStream当中。但是当我把上面注释代码1放开之后(另外的一个方案是创建两个线程,一个从InputStream读取执行结果,一个从ErrorStream中读取执行结果),程序仍然阻塞在read代码处。

继续google,提到了有可能因为Process是在等待输入结束的标志,在上面代码中,我们只是输入了wmic命令,但是没有结束输入,所以放开上面的注释代码2,问题解决。终于可以得到正确的输出了。

值得一提的是,当我们在创建的Process中先打开一个单独的cmd窗口,再执行上面的wmic命令时,确可以得到正确的输出结果。

 

上述代码在Win7,Win2008上可以很好的并发执行。但是在WinXP和Win2003上并发执行时,确遇到了如下的错误:

Win32 Error: The process cannot access the file because it is being used by another process

 通过观察发现,在WinXP和Win2003上执行代码时,会生成一个临时的TempWmicBatchFile.bat文件,因此就可以解释上面的现象了,因为临时文件的访问没有被同步。但是如果对每个命令执行都同步这个临时文件,当命令很多时,有可能出现大面积等待的请求。考虑到我们不需要时时得到最新的数据,因此我们对每个命令的执行结果都进行了缓存,而对命令的执行进行了同步,这样每次来的新命令就可以先拿缓存的执行结果,然后把自己放到等到命令队列中。这样就有效的避免了上面的错误。

 

分享到:
评论

相关推荐

    WMIC-Java:可以执行 WMIC 和命令行参数。 需要适当的 GUI 和需要管理员权限的工作命令

    WMIC-Java 可以执行 WMIC 和命令行参数。 需要适当的 GUI 和需要管理员权限的工作命令。 由一个主方法和来自 3 个不同接口的覆盖方法组成,一个用于 WMIC 命令,一个用于常规 cmd 命令,另一个用于需要管理员权限的...

    批处理 wmic设置java环境变量自己测试过了没问题

    批处理bat命令,用wmic模式自动配置环境变量,不用刷新环境变量.直接就可以用,避开了重器服务麻烦.

    用于Wmic命令行无效情况下的补丁

    标题中的“用于Wmic命令行无效情况下的补丁”指的是针对Windows Management Instrumentation Command-line (WMIC)工具在Windows 7或Windows Server 2008系统上出现故障或无法正常工作时,需要应用的修复程序。WMIC是...

    wmic帮助方档wmic.chm

    wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档wmic帮助方档

    wmic取硬件信息模块.rar

    WMIC(Windows Management Instrumentation Command-line)是Windows操作系统中内置的一个命令行工具,用于访问Windows管理 instrumentation(WMI)提供程序。WMI是微软的一种系统管理架构,它允许管理员和其他应用...

    wmic实例应用修改版

    **WMIC(Windows Management Instrumentation Command-line)**是一种强大的命令行工具,用于管理和访问Windows管理信息库(WMI)。通过WMIC,用户可以在命令行界面中执行复杂的管理任务,而无需编写脚本或使用图形...

    WMIC命令详解

    WMIC(Windows Management Instrumentation Command-line)作为微软在Windows Server 2003中推出的一种全新的命令行管理工具,结合了WMI的强大功能与命令行的简洁特性。对于那些偏好命令行操作的系统管理员而言,...

    wmic命令行介绍及使用.pdf

    WMIC,全称为Windows Management Instrumentation Command Line,是Windows操作系统中的一个强大工具,它扩展了Windows Management Instrumentation(WMI)的功能,允许用户通过命令行界面执行系统管理和监控任务。...

    WMIC实例应用

    WMIC(Windows Management Instrumentation Command-line)是Windows操作系统自带的一个强大的命令行工具,可以用来查询、设置以及管理Windows系统的各种信息。下面介绍如何使用WMIC来查看磁盘的属性。 - **命令**:...

    wmic实例应用

    WMIC(Windows Management Instrumentation Command-line)是Windows操作系统中的一个强大的命令行工具,它允许用户通过WMI(Windows Management Instrumentation)接口进行系统管理。WMIC能够提供对操作系统、硬件...

    wmic.c C语言实现WMI

    wmic.c C语言实现WMI

    修复windows下不能使用wmic命令.bat

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。非常好用命令,这个脚本用于修复wmic不能使用的问题

    WMIC从命令行对Windows的全面管理

    Windows Management Instrumentation Command-line(WMIC)是Windows操作系统中一个强大的工具,它允许用户通过命令行接口执行各种系统管理和监控任务。WMIC是基于WMI(Windows Management Instrumentation)技术,...

    易语言wmic取硬件信息模块源码

    在本资源中,"wmic取硬件信息模块源码"是指利用Windows Management Instrumentation Command-line (WMIC)工具来获取计算机硬件信息,并将其转化为易语言可以处理的数据。WMIC是Windows操作系统内置的一个命令行接口...

    修复windows下不能使用wmic命令的脚本

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批命令脚本执行系统管理的支持。非常好用命令,这个脚本用于修复wmic不能使用的问题

Global site tag (gtag.js) - Google Analytics