我正在尝试在Windows Server 2003机器上获取正在运行的进程及其文件path的列表。 我正在使用下面的代码来尝试这样做:
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; }
程序卡在一个无限循环的条件。 “blah”和“Exited while loop”永远不会输出到日志。 我已经在我的win7本地机器和输出信息的服务器上的命令提示符运行命令就好了。 我也在我的本地机器上运行上面的代码也很好。 看起来这是Java和Windows Server 2003之间的一个问题,我在过去的3个小时的search中找不到。 任何帮助将非常感激。
在获取和使用InputStream
之前,您将需要获取并关闭OutputStream
。 这将确认您已经开始完成向流程发送输入(在这种情况下,没有输入)的过程。
p.getOutputStream().close();
请记住,在Process
对象上, getInputStream()
输入来自进程的输出流,而getOutputStream()
输出则来自进程的输入流。
记住BufferedReader.readLine()
操作将会阻塞,如果没有达到输入的结束,请看这里 。
我认为你正在经历的是在Process
API中解释的:
创建进程的方法可能不适用于某些本机平台上的特殊进程,例如本机窗口进程,守护进程,Microsoft Windows上的Win16 / DOS进程或shell脚本。 创建的子流程没有自己的终端或控制台。 所有标准的io(即stdin,stdout,stderr)操作将通过三个流(getOutputStream(),getInputStream(),getErrorStream())重定向到父进程。 父进程使用这些流将输入提供给子进程并从子进程获取输出。 由于某些本地平台仅为标准输入和输出流提供有限的缓冲区大小,因此如果不及时写入输入流或读取子流程的输出流,可能会导致子进程阻塞甚至死锁。