2

過去数ヶ月の問題に直面しています。私は解決策を見つけるために一生懸命努力しました。

Fedora 14 で Java を使用しています

問題は、Runtime.exec("yum -y install somePkg") を使用してパッケージをダウンロードしてインストールしようとしていますが、pc.getInputStream() を使用して stdout をキャプチャすると、現在のダウンロードが表示されないことです。進行状況、つまり、任意の形式でのダウンロードのパーセンテージ。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()

したがって、ハッキーな解決策は、Yum に pty を割り当てることです...

残念ながら、ストック Java ライブラリは、Linux が PTY の割り当てに使用する ptmx インターフェースへのアクセスを提供していないようです (ただし、JNI バインディングを使用してアクセスすることも考えられます — コードはそれほど複雑ではありません; Google で簡単に検索すると、そうするための素敵なストックライブラリを見つけられなかったので、おそらく私が見逃しているものがあるか、誰かが今ごろ転がっているはずだと思うでしょう)、これを行うための「最も簡単な」方法は、 Yum 内部を呼び出して入札を行い、コールバックを要求する Python ラッパー。いずれにせよ、純粋な Java ではありませんが、外部の Python インタープリターにリンクする (そして、Yum は Python であるため、インストールされている必要があることはわかっています) ほうが、C コードで JNI リンクを行うよりも手間がかからない可能性があります。(例として、

でも:

または、pkcon を使用すること、または DBus を使用して PackageKit と通信することを検討しましたか?

DBus を使用するのに外部ライブラリは必要ありませんが、インストール プロセスを少し考え直す必要があるかもしれません。http://dbus.freedesktop.org/doc/dbus-java/に Java DBus ライブラリがあり、接続ロジックをラップします。その時点で、例はhttp://www.packagekit.org/pk-faq.htmlにあります。 #session-methodsでアクセスの要点がわかります。DBus インターフェースは、進行中のトランザクションをチェックする方法を提供すると私は信じています。これは、私が見る最も「ハック」なソリューションかもしれません。そして、おまけとして、少なくともUbuntuに移植できます(私は信じています)。

ただし、pkcon はオプションです。tty でない場合は出力を減らしますが、進行状況を適切な解析可能な形式で stdout に書き込むように見えます。

  $ 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() でプロセス IO の処理を​​試みます。もう 1 つのヒントは、start メソッドを呼び出した後ですが、InputStream を取得する前に、Thread.sleep(a while) を呼び出します。

于 2011-11-26T12:47:03.310 に答える