Выполнение установщика yum с использованием java Runtime.exec () и отслеживание хода его загрузки - PullRequest
2 голосов
/ 26 ноября 2011

Я столкнулся с проблемой последних нескольких месяцев. Я очень старался найти решение.

Я использую Java поверх Fedora 14

Проблема в том, что я пытаюсь загрузить и установить пакет, используя Runtime.exec ("yum -y install somePkg"), но когда я использую pc.getInputStream () для захвата stdout, я не вижу текущий статус загрузки, т. е. процент загрузки в любой форме. Вывод остается «загрузка пакетов:» до тех пор, пока yum не закончит загрузку. После успешной загрузки. Я вижу только общий список установленных пакетов и сообщение о завершении загрузки в консоли вывода.

Мне нужно решение, даже если оно грязное. Мне нужно как-то захватить весь прогресс загрузки yum с помощью Java.

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

Непосредственно отвечая на вопрос, как задано:

Найден в источнике 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()

Итак, хакерским решением было бы выделить pty для Yum ...

К сожалению, похоже, что стандартные библиотеки Java не предоставляют доступ к интерфейсу ptmx, который Linux использует для распределения PTY (хотя, возможно, это можно сделать с помощью привязки JNI - код не будет ужасно сложным; хотя быстрый поиск в Google не привел к появлению хороших фондовых библиотек, так что, возможно, что-то мне не хватает, или я подозреваю, что у кого-то должна быть такая, которая уже есть), так что «самый простой» способ сделать это может быть написать оболочку Python, которая обращается к внутренним объектам Yum, чтобы выполнить его назначение, и запрашивает обратный вызов. В любом случае, не чистая Java, но соединение с внешним интерпретатором Python (и, поскольку Yum - это Python, вы знаете, что он должен быть установлен) может быть менее трудным, чем связывание JNI с некоторым C-кодом. (Например, вы можете посмотреть на ProcessTransPackageKitCallback в /usr/share/PackageKit/helpers/yum/yumBackend.py)

Тем не менее:

В качестве альтернативы вы рассматривали возможность использования pkcon или DBus для общения с PackageKit?

Использование DBus не потребует внешних библиотек, но может потребовать небольшого переосмысления процесса установки. Есть библиотека Java DBus на http://dbus.freedesktop.org/doc/dbus-java/, которая оборачивает логику соединения, и в этом случае примеры на http://www.packagekit.org/pk-faq.html#session-methods должны дать вам суть доступа к ней. Я полагаю , что интерфейс DBus предоставляет способ проверки транзакции по ходу ее выполнения, но я недостаточно знаком с DBus, чтобы дать убедительное подтверждение этому. Это может быть наименее "хакерское" решение, которое я вижу; и, в качестве бонуса, он переносим, ​​по крайней мере, в Ubuntu.

pkcon, однако, будет вариант. Похоже, что запись прогресса в stdout записывается в хорошем, разбираемом формате, даже несмотря на то, что он сокращает вывод, когда не является 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 - поэтому ваш пробег может отличаться.

0 голосов
/ 26 ноября 2011

создать новый экземпляр ProcessBuilder. После вызова метода start () попытайтесь обработать процесс ввода-вывода с помощью getInputStream () и / или getErrorStream (). Другие советы могут быть после вызова метода start, но прежде чем получить InputStream, вызовите Thread.sleep (некоторое время).

...