我面临着过去几个月的问题。我已经努力寻找解决方案。
我在 Fedora 14 上使用 Java
问题是,我正在尝试使用 Runtime.exec("yum -y install somePkg") 下载并安装包,但是当我使用 pc.getInputStream() 捕获标准输出时,我看不到当前下载进度状态,即任何形式的下载百分比。输出一直显示“正在下载软件包:”,直到 yum 完成下载。下载成功后。我在输出控制台中仅看到总体已安装的软件包列表和下载完成消息。
我需要一个解决方案,即使它很脏。我需要以某种方式使用 java 捕获 yum 的整个下载进度。
最佳答案
按照要求直接回答问题:
在 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()
所以,黑客解决方案是为 Yum 分配一个 pty...
不幸的是,似乎现有的 Java 库不提供对 Linux 用于分配 PTY 的 ptmx 接口(interface)的访问(尽管可以想象,可以使用 JNI 绑定(bind)来实现这一点 — 代码不会非常复杂;尽管快速谷歌搜索没有找到任何好的库存库来做到这一点,所以也许我遗漏了一些东西,或者我怀疑有人现在应该有一个),所以“最简单”的方法可能是编写一个 Python 包装器,调用 Yum 内部执行其命令,并请求回调。无论哪种方式,不是纯 Java,而是链接到外部 Python 解释器(并且,由于 Yum 是 Python,您知道必须安装一个解释器)可能比使用某些 C 代码进行 JNI 链接要少一些麻烦。 (例如,您可以查看/usr/share/PackageKit/helpers/yum/yumBackend.py 中的 ProcessTransPackageKitCallback)
但是:
或者,您是否考虑过使用 pkcon 或使用 DBus 与 PackageKit 对话?
使用 DBus 不需要外部库,但可能需要重新考虑您的安装过程。 http://dbus.freedesktop.org/doc/dbus-java/ 有一个 Java DBus 库包装连接逻辑,此时,http://www.packagekit.org/pk-faq.html#session-methods 处的示例应该为您提供访问它的要点。我相信 DBus 接口(interface)提供了一种在事务处理过程中检查事务的方法 - 但我对 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 上——所以你的情况可能会有所不同。
关于java - 使用 java Runtime.exec() 执行 yum 安装程序并捕获其下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278443/