Ce que je veux scénariser est quelque chose comme:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
Le problème est que si la sortie de rpm -q kernel
est quelque chose comme:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
… Comment déterminer lequel est le plus élevé? Je sais qu'un simple tri de chaîne n'est pas fiable (il sera inversé avec cet exemple). Existe-t-il un raccourci avec rpm ou dois-je tout analyser et le comparer moi-même?
sort -V
ne donne pas un résultat correct?Réponses:
TL; DR
La 3ème tentative fonctionne réellement! Je laisse les 2 premières tentatives afin que d'autres qui pourraient rencontrer ce Q & A à l'avenir puissent, espérons-le, avoir un aperçu de la façon dont un problème n'est pas trivial d'analyser les informations de version de RPM et de déterminer la lignée qui vient en premier, en second, etc.
Tentative n ° 1 (OP a dit que cela ne fonctionnait pas)
Cette commande triera la sortie et vous la donnera dans l'ordre des versions:
POURQUOI CELA N'A PAS FONCTIONNÉ: Une personne naïve penserait que vous pouvez utiliser une variante de la
sort
commande pour effectuer cette tâche, mais il y a suffisamment de variabilité et d'incohérence dans le formatage des informations de version réelles pour un RPM donné, ce n'est tout simplement pas '' t à la hauteur de la tâche.Tentative n ° 2 (OP a dit que cela ne fonctionnait pas)
POURQUOI IL N'A PAS FONCTIONNÉ: J'espérais fortement que cette approche produirait les résultats que le PO recherchait, mais le problème avec celui-ci, comme @Joel l'a souligné dans les commentaires, est que le
--last
commutateur renvoie simplement les résultats triés par la date d'installation des RPM.Tentative # 3
Celui-ci fera certainement le travail. J'ai trouvé une suite d'outils appelés RPM Development Tools. Cette suite comprend 2 outils qui vous permettront de déterminer si une version d'un RPM est plus récente ou plus ancienne qu'une autre.
Si le RPM n'est pas déjà installé, vous pouvez le faire comme suit:
Le premier outil utile est appelé
rpmdev-vercmp
. Cet outil peut comparer 2 noms de RPM et vous dire lequel est le plus récent. Par exemple:Après avoir trouvé cela, j'étais prêt à assembler un script shell, mais j'ai réalisé que je suis paresseux, alors j'ai fouillé quelques minutes de plus et j'ai trouvé un autre outil dans la suite appelé
rpmdev-sort
.Cet outil est de la saleté. Vous pouvez l'utiliser comme suit:
Il y a beaucoup d'outils dans les outils de développement RPM qui pourraient valoir le coup d'œil pour d'autres, donc je les répertorie ici pour référence future.
Une alternative au # 3
Une alternative que le PO mentionnée dans les commentaires est d'utiliser
sort -V
. Voilà une capitale-V
. Je n'avais jamais entendu parler de cet interrupteur non plus. Depuis lasort
page de manuel:En fait, il
sort
fournit une fonction pour trier les numéros de version afin que vous puissiez également effectuer le tri comme suit:la source
--last
trie par heure d'installation du package, ce ne sera pas nécessairement le dernier noyau (s'ils ont fait une installation rpm manuelle d'une version de noyau inférieure, par exemple).Vous avez vraiment besoin d'utiliser la bibliothèque RPM pour obtenir un bon résultat. L'algorithme de comparaison de versions est ... décidément complexe. Il n'est pas trivial de réimplémenter dans le shell, mais si vous pouvez utiliser Python pour faire la comparaison réelle, cela devient relativement simple. Voir /programming/3206319/how-do-i-compare-rpm-versions-in-python pour un exemple de la façon de procéder.
la source
Je pense que le tri par buildtime est moins susceptible d'avoir un cas d'angle où il échoue, contrairement à installtime. Cependant, --last est plus net.
la source
--last
ne vous indiquera pas le numéro de version le plus élevé, mais il sera commandé par date d'installation. Vous pouvez donc voir la dernière version installée:La plupart du temps (à moins d'une installation manuelle du noyau), les deux devraient être les mêmes.
Pour le faire 100% correctement 100% du temps, vous devrez réduire le
2.6.*
format des deux versions du noyau , puis le séparer à partir de la 2.6 (RHEL ne rebasera pas de manière drastique dans une seule version, RHEL5 sera toujours un noyau 2.6) et il suffit d'itérer sur chaque ligne de sortie rpm (éventuellement trié--last
pour les performances) et de comparer chaque position par rapport à la position analogue dans la version du noyau que vous avez obtenueuname -r
si l'un des nombres est plus grand dans la chaîne de la base de données rpm que la chaîne uname, quittez immédiatement avec ce message.Pour vous aider, une question similaire est posée ici . Mais cette fonction suppose une notation décimale purement en pointillés, vous pouvez donc comparer la position du nombre avant le trait d'union (car il n'y en a qu'un), puis utiliser la fonction bash de cette personne pour tester si la version du correctif est plus élevée
uname
que dans la chaîne de base de données rpm.la source