java - 使用 java Runtime.exec() 执行 yum 安装程序并捕获其下载进度

标签 java linux runtime fedora yum

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

我在 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/

相关文章:

java - 为什么 == 对于整数和字符串不同?

java - 为什么我的代码修改了错误的数组?

java - Java中的Itext PDF操作

java - 如何使Jenkins认为Maven -SNAPSHOT jar Artifact 的两个不同版本与连续交付的一部分相同?

python - 在python中如何计算特定参数之后传递的参数数量?

java - 无法使用 java jdbc 驱动程序连接到 Mysql

JAVA冒泡排序运行时问题

c++ - 如何中止 'close' TCP 连接?

运行时的 C++ 变量类型

C++ 在运行时分配一个 const 值?