То, что я хочу, чтобы сценарий это что-то вроде:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
Проблема в том, что если результат rpm -q kernel
выглядит примерно так:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
... как определить, что выше? Я знаю, что простая сортировка строк не является надежной (в этом примере она будет обратной). Есть ли ярлык с rpm или мне нужно все разобрать и сравнить самому?
sort -V
не дает правильного результата?Ответы:
TL; DR
3-я попытка действительно работает! Я оставляю первые две попытки, чтобы другие, которые могут столкнуться с этими вопросами и ответами в будущем, надеялись получить некоторое представление о том, насколько нетривиальной является проблема анализа информации о версии RPM и определения происхождения, который пришел первым, вторым, и т.п.
Попытка № 1 (OP сказал, что не работает)
Эта команда отсортирует выходные данные и выдаст их в порядке версий:
ПОЧЕМУ ЭТО НЕ РАБОТАЕТ: Наивный человек может подумать, что вы можете использовать какой-либо вариант
sort
команды для выполнения этой задачи, но в форматировании фактической информации о версии для данного RPM достаточно вариативности и несоответствия, что это просто не так. Т до задачи.Попытка № 2 (OP сказал, что не работает)
ПОЧЕМУ ЭТО НЕ РАБОТАЕТ: я возлагал большие надежды на то, что этот подход даст результаты, которые ищет ОП, но проблема с этим, как указал @Joel в комментариях, заключается в том, что
--last
переключатель просто возвращает результаты, отсортированные по дата установки RPM.Попытка № 3
Этот определенно сделает работу. Я нашел набор инструментов под названием RPM Development Tools. В этом наборе есть 2 инструмента, которые дадут вам возможность определить, является ли одна версия RPM более новой или более старой, чем другая.
Если RPM еще не установлен, вы можете сделать это следующим образом:
Первый полезный инструмент называется
rpmdev-vercmp
. Этот инструмент может сравнить 2 имени RPM и сказать вам, какое из них более новое. Например:После того, как я нашел это, я был готов собрать сценарий оболочки, но потом понял, чувак, я ленивый, поэтому я потыкал еще несколько минут и нашел в комплекте другой инструмент под названием
rpmdev-sort
.Этот инструмент платный. Вы можете использовать его следующим образом:
В инструментах разработки RPM есть много инструментов, на которые стоит обратить внимание другим, поэтому я перечислю их здесь для дальнейшего использования.
Альтернатива № 3
Альтернатива, которую ОП упоминает в комментариях, заключается в использовании
sort -V
. Это столица-V
. Я никогда не слышал об этом переключателе либо. Соsort
страницы руководства :Оказывается,
sort
есть возможность сортировки номеров версий, чтобы вы также могли выполнить сортировку следующим образом:источник
--last
сортирует по времени установки пакета, это не обязательно будет самое последнее ядро (например, если они выполнили ручную установку rpm более низкой версии ядра).Вам действительно нужно использовать библиотеку RPM, чтобы получить хороший результат. Алгоритм сравнения версий ... безусловно сложен. Переопределение в оболочке нетривиально, но если вы можете использовать Python для фактического сравнения, это становится относительно простым. См. Https://stackoverflow.com/questions/3206319/how-do-i-compare-rpm-versions-in-python для примера того, как это сделать.
источник
Я думаю, что сортировка по времени сборки с меньшей вероятностью будет иметь место в случае неудачи, в отличие от времени установки. Тем не менее, --last аккуратнее.
источник
--last
не сообщит вам наибольший номер версии, но упорядочит по дате установки. Итак, вы можете увидеть самую последнюю установленную версию:В большинстве случаев (если они не установили ядро вручную) они должны быть одинаковыми.
Чтобы получить 100% правильность в 100% случаев, вам нужно будет
2.6.*
отформатировать две версии ядра, а затем просто разбить их на части, начиная с версии 2.6 (RHEL не будет сильно перебазировать в одной версии, RHEL5 всегда будет ядром 2.6) и просто перебирает каждую строку выходных данных rpm (возможно, отсортированных по--last
производительности) и сравнивает каждую позицию с аналогичной позицией в версии ядра, из которой вы получили,uname -r
если любое из чисел больше в строке базы данных rpm чем строка uname, немедленно завершите работу с этим сообщением.Чтобы помочь вам, есть похожий вопрос, заданный здесь . Но эта функция предполагает использование десятичной записи с точками в точках, поэтому вы можете сравнить числовую позицию перед дефисом (поскольку она есть только одна), а затем использовать функцию bash этого человека, чтобы проверить, выше ли версия патча,
uname
чем в строке rpm db.источник