У меня есть следующая проблема: Я записал сценарий, который извлекает информацию об установленных пакетах моей системы (Ubuntu 16.04 LTS). Я особенно интересуюсь источником пакета. Это означает, что данные Источников APT от apt show <packagename>
крайне важно для меня.
На данный момент мой сценарий должен звонить apt show
для каждого установленного пакета, который создает почти недопустимую рабочую нагрузку по сравнению с тем, насколько маленький из задачи это должно быть [загрузка ЦП достигает почти 100%].
Я надеялся, что был некоторый файл в системе, которая имеет всю хранившую информацию, который производится apt show
. Чтение и парсинг того файла должны быть быстрее, чем вызов apt show
тысячи времен. Есть ли такой файл?
Отметьте, который я уже попытался использовать dpkg
и apt-cache
, но оба не предоставляют информацию об Источниках APT.
править: Возможно, некоторая разработка могла бы быть полезной. Мои вызовы сценария Python apt list --installed
для получения списка установленных пакетов и синтаксических анализов, этот вывод в список, содержа только пакет называет как строки.
Затем это звонит apt show
для каждого элемента в этом списке.
Мне понравилось бы, чтобы только иметь единственный файл, читайте однажды, который содержит информацию об установленных пакетах. У меня затем был бы свой сценарий, анализирует этот файл, добавляет информация к элементу списка и быть сделанной в одном повторении. Моя надежда была, то чтение большого файла однажды и парсинг его, быстрее, чем вызов команды CLI много сотен времен.
По сути, я принимаю, это grep
луг по нескольким файлам многократно действительно не уменьшил бы рабочую нагрузку.
Я в основном реализовал систему для слежения за установленными пакетами в нашей среде, собрав информацию о них и проверке, если некоторые из тех установлены с неверной версией. Так как некоторые из этих пакетов прибывают из наших собственных репозиториев интерна, необходимо знать, куда пакет прибыл из.
Использование APT Python API:
#! /usr/bin/python3
import apt
cache = apt.cache.Cache()
for pkg in cache:
if pkg.is_installed:
name = pkg.name
version = pkg.installed.version
origins = [o.site for o in pkg.installed.origins if o.site]
print(name, version, origins)
Пример произвел:
$ ./foo.py| head
a11y-profile-manager-indicator 0.1.10-0ubuntu3 ['jp.archive.ubuntu.com']
account-plugin-facebook 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
account-plugin-flickr 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
account-plugin-google 0.12+16.04.20160126-0ubuntu1 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
accountsservice 0.6.40-2ubuntu11.3 ['jp.archive.ubuntu.com']
acl 2.2.52-3 ['jp.archive.ubuntu.com']
acpi-support 0.142 ['jp.archive.ubuntu.com']
acpid 1:2.0.26-1ubuntu2 ['jp.archive.ubuntu.com']
activity-log-manager 0.9.7-0ubuntu23.16.04.1 ['jp.archive.ubuntu.com']
adduser 3.113+nmu3ubuntu4 ['jp.archive.ubuntu.com', 'jp.archive.ubuntu.com']
Здесь:
ls /var/lib/apt/lists
зависьте от репозитория и раздела, например, для сбора данных вокруг wget
в main
раздел для amd64
архитектура можно использовать:
grep -A20 "Package: wget" /var/lib/apt/lists/*_ubuntu_dists_xenial-updates_main_binary-amd64_Packages
или поскольку Muru предложил использование awk
для более гибкого результата:
awk -v RS='\n\n' -v pkg=wget '$2 == pkg' /var/lib/apt/lists/*_ubuntu_dists_xenial_main_binary-amd64*
RS
(Разделитель записей) мы можем легко получить все данные, связанные с нашим пакетом.Отметьте это apt
также использование некоторые двоичные кэши, сделанные из вышеупомянутых файлов увеличить скорость его запросов, эти кэши расположены здесь:
ls /var/cache/apt/