【问题标题】:capture output of a running process in Java在 Java 中捕获正在运行的进程的输出
【发布时间】:2015-03-10 18:38:01
【问题描述】:

(我使用的是 Windows 7)我知道如何启动一个进程、传递一些参数并读取该进程的输出。

import java.io.*;
class Test {
    public static void main(String args[]) throws IOException  {
        ProcessBuilder pb
                = new ProcessBuilder("java", "ProgramFoo", "ArgBar");
        Process process = pb.start();
        final InputStream is = process.getInputStream();
            BufferedReader reader
                    = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
    }
}

但我想做的是读取运行进程的输出。可能是它的 PID 或名称。

有什么想法吗?

【问题讨论】:

  • 我怀疑这是可能的。至少以独立于平台的方式。
  • @aioobe 我忘了提到告诉操作系统我正在使用的原因。我不介意它是否仅适用于 Windows 解决方案。
  • @M1990 你能解释一下你想要做的更多吗?如果一个进程已经在运行,则要么没有分配标准输出(例如 chrome.exe),要么它已经链接到命令行窗口并且cmd 正在读取流。如果您之前从同一个 Java 进程启动了新进程,只需按住 Process 对象,将其传递,稍后再读取流。
  • @TWiStErRob 我有几个硬编码的 - 没有可用的源代码 - 遗留程序。它们每分钟输出几行文本(到控制台)(它们可以持续运行数小时)。我需要执行这些程序,并将它们的输出发送到服务器。

标签: java process stdout


【解决方案1】:

查看http://commons.apache.org/proper/commons-exec/ 以更好地处理流程。

或者,您可以从已有的进程中获取 InputStream 并像这样读取它:

BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

StringBuffer stringBuffer = new StringBuffer();

stdout = br.readLine();
while (stdout != null) {
    stringBuffer.append(stdout);
    stdout = br.readLine();
}

【讨论】:

  • 嗯...不确定你是否理解这个问题。
  • 看起来您正在尝试从当前应用程序外部启动一个进程,并传递输入并检索其输出。 Apache Commons Exec 库将允许您做这两件事。有什么我错过的吗?
  • OP 是 not 试图启动一个进程:“但我想要做的是读取 running 的输出过程。”
猜你喜欢
  • 2020-09-29
  • 2022-11-16
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2023-01-10
相关资源
最近更新 更多