2012-11-13 30 views
1

我试图在Windows Server 2003机器上获取正在运行的进程及其文件路径的列表。我正在使用以下代码尝试执行此操作:Java在无限循环中停留在Windows Server 2003上执行wmic命令

protected Map<String,String> getProcesses() { 
    Map<String,String> processes = new HashMap<String,String>(); 
    try { 
     String line; 
     Process p = null; 

     // Windows 
     if (OS.indexOf("win") >= 0) { 
      p = Runtime.getRuntime().exec("wmic process get description,executablepath"); 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      LOG.info("Entering while loop"); 
      while ((line = input.readLine()) != null) { 
       LOG.info("blah"); 
       String[] array = line.split("\\s+"); 
       if (array.length > 1) { 
        processes.put(array[0], array[1]); 
       } 
      } 
      LOG.info("Exited while loop"); 
      input.close(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return processes; 
} 

程序在while情况下陷入无限循环。 “blah”和“Exited while loop”永远不会输出到日志。我在win7本地机器和输出信息的服务器上都运行了命令提示符。我也在我的本地机器上运行上面的代码,这也很好。看起来这是Java和Windows Server 2003之间的一个问题,我在过去的3个小时的搜索中没有找到。任何帮助将非常感激。

回答

9

在获取和使用您的InputStream之前,您需要获取并关闭您的OutputStream。这将确认你已经开始完成向流程发送输入(在这种情况下,没有输入)的过程。

p.getOutputStream().close(); 

记住Process对象上,getInputStream()输入来自该过程的输出数据流,并输出getOutputStream()进入该过程的输入流。

+0

嗯,我会尝试'p.getOutputStream()。close(); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));'看看会发生什么。我会很快回报。 – lancex

+0

嘿!嘿!有效!感谢您的帮助:) – lancex

+0

您的答案解决了我的问题3个小时后头部划伤。我打算把它称为wmic中的一个bug,但我会采取工作。谢谢!!奇怪的是,如果将wmic输出重定向到文件并且不关闭输出流,它就会起作用。这不仅仅是一个java问题。我在vbscript测试用例中遇到了同样的问题。 –

2

记住BufferedReader.readLine()操作会阻止,如果没有达到输入的结束,请参阅here

我认为你正在经历的APIProcess解释:

创造过程可能不适合于某些本地平台特殊工艺,比如,本机窗口进程,守护进程很好地工作的方法, Windows上的Win16/DOS进程或shell脚本。创建的子流程没有自己的终端或控制台。它的所有标准io(即stdin,stdout,stderr)操作将通过三个流(getOutputStream(),getInputStream(),getErrorStream())重定向到父进程。父进程使用这些流将输入提供给子进程并从子进程获取输出。由于某些本地平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子流程的输出流可能会导致子流程阻塞甚至死锁。

+0

因此,也许当我在服务器上运行它时,进程数会在缓冲区溢出之前从缓冲区中读取? – lancex

+0

这是一种可能性。我对wmic命令并不熟悉,所以我不能肯定地说这是事实。另外,@rgettman是对的,你应该阅读OutputStream过程。 –

+0

他确实是对的,像魅力一样工作。 – lancex