Was ich schreiben möchte, ist etwas in der Art von:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
Das Problem ist, wenn die Ausgabe von rpm -q kernel
so etwas wie:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
… Wie bestimme ich, welche höher ist? Ich weiß, dass eine einfache Zeichenfolgensortierung nicht zuverlässig ist (in diesem Beispiel ist sie rückwärts). Gibt es eine Verknüpfung mit U / min oder muss ich alles analysieren und selbst vergleichen?
sort -V
gibt nicht das richtige Ergebnis?Antworten:
TL; DR
Der 3. Versuch funktioniert tatsächlich! Ich lasse die ersten beiden Versuche, damit andere, die in Zukunft auf diese Fragen und Antworten stoßen, hoffentlich einen Einblick in das nicht triviale Problem erhalten, RPM-Versionsinformationen zu analysieren und die Herkunft zu bestimmen, die zuerst, zweitens, usw.
Versuch Nr. 1 (OP sagte, hat nicht funktioniert)
Dieser Befehl sortiert die Ausgabe und gibt sie in der Versionsreihenfolge aus:
WARUM ES NICHT FUNKTIONIERTE: Eine naive Person würde denken, dass Sie eine Variante des
sort
Befehls verwenden können, um diese Aufgabe auszuführen, aber die Formatierung der tatsächlichen Versionsinformationen für eine bestimmte Drehzahl ist so variabel und inkonsistent, dass es einfach nicht so ist. t bis zur Aufgabe.Versuch Nr. 2 (OP sagte, hat nicht funktioniert)
WARUM ES NICHT FUNKTIONIERTE: Ich hatte große Hoffnungen, dass dieser Ansatz die Ergebnisse liefern würde, nach denen das OP gesucht hatte, aber das Problem bei diesem Ansatz, wie @Joel in den Kommentaren hervorhob, ist, dass der
--last
Schalter lediglich die Ergebnisse sortiert nach zurückgibt das Datum, an dem die RPMs installiert wurden.Versuch Nr. 3
Dieser wird definitiv den Job machen. Ich habe eine Reihe von Tools namens RPM Development Tools gefunden. Diese Suite enthält zwei Tools, mit denen Sie feststellen können, ob eine Version eines RPM neuer oder älter als eine andere ist.
Wenn das RPM noch nicht installiert ist, können Sie dies wie folgt tun:
Das erste nützliche Tool heißt
rpmdev-vercmp
. Dieses Tool kann 2 Namen von RPMs vergleichen und Ihnen sagen, welcher neuer ist. Zum Beispiel:Nachdem ich das gefunden hatte, war ich bereit, ein Shell-Skript zusammenzustellen, aber dann wurde mir klar, Mann, ich bin faul, also stocherte ich noch ein paar Minuten und fand ein anderes Tool in der Suite namens
rpmdev-sort
.Dieses Tool ist Pay-Dirt. Sie können es wie folgt verwenden:
Es gibt viele Tools in RPM-Entwicklungstools, die für andere einen Blick wert sein könnten, daher liste ich sie hier als zukünftige Referenz auf.
Eine Alternative zu # 3
Eine Alternative, die das OP in den Kommentaren erwähnt, ist die Verwendung
sort -V
. Das ist eine Hauptstadt-V
. Ich hatte auch noch nie von diesem Schalter gehört. Von dersort
Manpage:Wie sich herausstellt,
sort
bietet es eine Möglichkeit, Versionsnummern zu sortieren, sodass Sie die Sortierung auch folgendermaßen durchführen können:quelle
--last
sortiert nach Paketinstallationszeit , es wird nicht unbedingt der neueste Kernel sein (wenn sie beispielsweise eine manuelle RPM-Installation einer niedrigeren Kernelversion durchgeführt haben).Sie müssen wirklich die RPM-Bibliothek verwenden, um ein gutes Ergebnis zu erzielen. Der Versionsvergleichsalgorithmus ist ... ausgesprochen komplex. Die Neuimplementierung in der Shell ist nicht trivial, aber wenn Sie Python für den eigentlichen Vergleich verwenden können, wird dies relativ einfach. Unter /programming/3206319/how-do-i-compare-rpm-versions-in-python finden Sie ein Beispiel dafür.
quelle
Ich denke, dass das Sortieren nach Buildtime im Gegensatz zur Installationszeit weniger wahrscheinlich einen Eckfall hat, in dem es fehlschlägt. Allerdings ist --last ordentlicher.
quelle
--last
Die höchste Versionsnummer wird nicht angegeben, aber nach Installationsdatum sortiert. So können Sie die zuletzt installierte Version sehen:Die meiste Zeit (es sei denn, sie haben eine manuelle Kernelinstallation durchgeführt) sollten die beiden gleich sein.
Um 100% der Zeit 100% richtig zu machen, müssen Sie die beiden Kernel-Versionen auf das
2.6.*
Format reduzieren und sie dann ab Version 2.6 auseinander brechen (RHEL wird dies in einer einzelnen Version, RHEL5, nicht drastisch zurücksetzen wird immer ein 2.6-Kernel sein) und einfach über jede Zeile der Drehzahlausgabe iterieren (möglicherweise nach--last
Leistung sortiert ) und jede Position mit der analogen Position in der Kernel-Version vergleichen, von der Sie erhalten haben,uname -r
wenn eine der Zahlen in der Zeichenfolge der Drehzahl-Datenbank größer ist Beenden Sie die Meldung sofort mit dieser Nachricht.Damit Sie da draußen gibt es eine ähnliche Frage hier gefragt . Diese Funktion setzt jedoch eine rein gepunktete Dezimalschreibweise voraus. Sie können also die Zahlenposition vor dem Bindestrich vergleichen (da es nur einen gibt) und dann mit der Bash-Funktion dieser Person testen, ob die Patch-Version höher ist
uname
als in der RPM-DB-Zeichenfolge.quelle