2

我面临着过去几个月的问题。我一直在努力寻找解决方案。

我在 Fedora 14 上使用 Java

问题是,我正在尝试使用 Runtime.exec("yum -y install somePkg") 下载并安装一个包,但是当我使用 pc.getInputStream() 捕获标准输出时,我看不到当前下载进度状态,即任何形式的下载百分比。在 yum 完成下载之前,输出会停留在“downloading packages:”。下载成功后。我在输出控制台中只看到一个整体安装的包列表和下载完成消息。

我需要一个解决方案,即使它很脏。我需要以某种方式使用 java 捕获 yum 的整个下载进度。

4

2 回答 2

4

直接回答问题,如问:

在 Yum (/usr/share/yum-cli/output.py) 源代码中找到:

    if self.conf.debuglevel < 2 or not sys.stdout.isatty():
        progressbar = None
        callback = None
    else:
        progressbar = YumTextMeter(fo=sys.stdout)
        callback = CacheProgressCallback()

所以,hacky 的解决方案是为 Yum 分配一个 pty ......

不幸的是,现有的 Java 库似乎不提供对 Linux 用于分配 PTY 的 ptmx 接口的访问(尽管可以想象,使用 JNI 绑定可以做到这一点 - 代码不会非常复杂;尽管快速谷歌搜索没有找到任何好的库存库来这样做,所以也许我缺少一些东西,或者我怀疑现在应该有人在附近),所以“最简单”的方法可能是写一个Python 包装器,它调用 Yum 内部进行投标,并要求回调。无论哪种方式,都不是纯 Java,而是链接到外部 Python 解释器(而且,由于 Yum 是 Python,你知道必须安装一个)可能比使用 JNI 链接一些 C 代码更容易。(举个例子,

然而:

或者,您是否考虑过使用 pkcon 或使用 DBus 与 PackageKit 通信?

使用 DBus 不需要外部库,但可能需要重新考虑您的安装过程。在http://dbus.freedesktop.org/doc/dbus-java/有一个 Java DBus 库,它包装了连接逻辑,此时,http://www.packagekit.org/pk-faq.html中的示例#session-methods应该为您提供访问它的要点。我相信DBus 接口提供了一种在事务处理过程中检查事务的方法——但我对 DBus 不够熟悉,无法对此做出可靠的陈述。这可能是我看到的最不“hacky”的解决方案;而且,作为奖励,它至少可以移植到 Ubuntu(我相信)。

但是,pkcon 将是一种选择。它似乎以一种很好的、​​可解析的格式将进度写入标准输出,即使它在不是 tty 时确实会减少其输出:

  $ pkcon update > tmp < /dev/null & tail -f tmp
Transaction:    Updating packages
Status:     Waiting for authentication
Status:     Waiting in queue
Status:     Starting
Status:     Resolving dependencies
Status:     Downloading packages
Percentage: 10
Percentage: 40
Percentage: 50
Percentage: 70

那是实际的输出,所以粒度不是很大,但它看起来对解析很友好。

恐怕我没有可供比较的 Fedora 14 盒子——这是在 Fedora 15 上——所以你的里程可能会有所不同。

于 2011-11-29T23:05:31.750 回答
0

创建一个新的 ProcessBuilder 实例。调用 start() 方法后,尝试使用 getInputStream() 和/或 getErrorStream() 处理 Process IO。另一个提示可能是在调用 start 方法之后但在获取 InputStream 之前,调用 Thread.sleep(a while)。

于 2011-11-26T12:47:03.310 回答