To, co chcę napisać, to coś w stylu:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
Problem polega na tym, że jeśli wynik rpm -q kernel
jest podobny do:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
… Jak ustalić, która z nich jest wyższa? Wiem, że proste sortowanie łańcuchów nie jest niezawodne (w tym przykładzie będzie odwrotnie). Czy istnieje skrót do rpm, czy muszę samodzielnie wszystko przeanalizować i porównać?
sort -V
nie daje poprawnego wyniku?Odpowiedzi:
TL; DR
Trzecia próba faktycznie działa! Opuszczam pierwsze 2 próby, aby inni, którzy mogą spotkać się z tymi pytaniami i odpowiedziami w przyszłości, mają nadzieję uzyskać pewien wgląd w to, jak nietrywialny problem to parsowanie informacji o wersji RPM i określenie pochodzenia, który był pierwszy, drugi, itp.
Próba nr 1 (OP powiedział, że nie działa)
To polecenie posortuje dane wyjściowe i wyświetli je w kolejności wersji:
DLACZEGO TO NIE DZIAŁA: Naiwna osoba pomyślałaby, że możesz użyć jakiegoś wariantu
sort
polecenia do wykonania tego zadania, ale istnieje wystarczająca zmienność i niespójność w formatowaniu informacji o aktualnej wersji dla danego RPM, że to po prostu nie jest ' t do zadania.Próba # 2 (OP powiedział, że nie działa)
DLACZEGO TO NIE DZIAŁA: Miałem wielką nadzieję, że takie podejście przyniesie wyniki, których szukał PO, ale problemem z tym, jak zauważył @Joel w komentarzach, jest to, że
--last
przełącznik po prostu zwraca wyniki posortowane według data zainstalowania RPM.Próba # 3
Ten z pewnością wykona zadanie. Znalazłem zestaw narzędzi o nazwie RPM Development Tools. W tym pakiecie znajdują się 2 narzędzia, które umożliwią określenie, czy jedna wersja RPM jest nowsza czy starsza od innej.
Jeśli RPM nie jest jeszcze zainstalowany, możesz to zrobić w następujący sposób:
Pierwsze przydatne narzędzie nazywa się
rpmdev-vercmp
. To narzędzie może porównać 2 nazwy RPM i powiedzieć, która z nich jest nowsza. Na przykład:Po znalezieniu tego, wszystko było gotowe, aby napisać skrypt powłoki, ale potem zrozumiałem, człowieku, jestem leniwy, więc naciągnąłem jeszcze kilka minut i znalazłem inne narzędzie w pakiecie o nazwie
rpmdev-sort
.To narzędzie jest brudne. Możesz użyć tego w następujący sposób:
Istnieje wiele narzędzi w RPM Development Tools, które mogą być warte poszukiwania innych, dlatego wymieniam je tutaj w celu późniejszego wykorzystania.
Alternatywa dla # 3
Alternatywą, z której korzysta OP wymieniona w komentarzach, jest skorzystanie
sort -V
. To stolica-V
. Nigdy nie słyszałem o tym przełączniku. Ze strony podręcznikasort
:Jak się okazuje,
sort
zapewnia funkcję sortowania numerów wersji, dzięki czemu można również wykonać sortowanie w następujący sposób:źródło
--last
sortuje według czasu instalacji pakietu, niekoniecznie będzie to najnowsze jądro (na przykład, jeśli wykonali ręczną instalację rpm niższej wersji jądra).Naprawdę musisz użyć biblioteki RPM, aby uzyskać dobry wynik. Algorytm porównywania wersji jest ... zdecydowanie złożony. Ponowna implementacja w powłoce nie jest trywialna, ale jeśli możesz użyć Pythona do wykonania rzeczywistego porównania, staje się to stosunkowo proste. Zobacz /programming/3206319/how-do-i-compare-rpm-versions-in-python, aby dowiedzieć się, jak to zrobić.
źródło
Sądzę, że sortowanie według czasu kompilacji rzadziej ma przypadek narożny, w którym kończy się niepowodzeniem, w przeciwieństwie do czasu instalacji. Jednak --last jest fajniejszy.
źródło
--last
nie powie Ci najwyższego numeru wersji, ale uporządkuje według daty instalacji. Abyś mógł zobaczyć najnowszą wersję:Przez większość czasu (chyba że zrobili ręczną instalację jądra) oba powinny być takie same.
Aby uzyskać 100% poprawność w 100% przypadków, będziesz musiał sprowadzić dwie wersje jądra do
2.6.*
formatu, a następnie po prostu rozdzielić go, zaczynając od wersji 2.6 (RHEL nie zmieni tak drastycznie w ramach jednej wersji, RHEL5 zawsze będzie jądrem 2.6) i po prostu iteruje każdą linię wyjścia rpm (ewentualnie posortowane według--last
wydajności) i porównuje każdą pozycję z analogiczną pozycją w wersji jądra, z której otrzymałeś,uname -r
jeśli którakolwiek liczba jest większa w ciągu db rpm db niż ciąg uname, natychmiast zakończ z tą wiadomością.Aby pomóc tam istnieje podobne pytanie zadawane tutaj . Ale ta funkcja zakłada czysto kropkowany zapis dziesiętny, więc możesz porównać pozycję liczb przed myślnikiem (ponieważ jest tylko jeden), a następnie użyć funkcji bash tej osoby, aby sprawdzić, czy wersja łatki jest wyższa
uname
niż w ciągu db rpm db.źródło
źródło
uname -r
nie jest zainstalowany najwyższy poziom RPM jądra”. Program brzmi, jakby mógł rozwiązać problem, więc jeśli mógłbyś przeliterować to dla PO, byłaby to dobra odpowiedź. Dziękuję Ci!