Pracuję w środowisku, w którym powoli przenosimy maszyny z Red Hat Enterprise Linux 5 na RHEL 6.
Potrzebuję niektórych moich skryptów, aby zrobić coś subtelnie innego na maszynach RHEL6 niż to, co jest obecnie wykonywane na maszynach RHEL5.
Pragmatycznym rozwiązaniem jest sprawdzenie w czasie wykonywania i uruchomienie niektórych poleceń na RHEL5, innych na RHEL6 i niektórych na obu.
Praktycznym przykładem tego jest to, że używamy modułów środowiska, a mój .bashrc
zawiera module load git
wiersz, ale na maszynach RHEL6 to polecenie powoduje błędy:
RHEL6 system, git should be installed - not loading module
Przeglądając plik modułu, znajduję następujący kod:
set redhatrelease [eval exec "cat /etc/redhat-release"]
if { [regexp -nocase {release 6} $redhatrelease] } {
puts stderr "\n\t RHEL6 system, git should be installed - not loading module\n"
} else {
...
}
Wydaje się, że robi to, co chcę, ale liczyłem na coś krótszego.
Więc jaki jest najłatwiejszy sposób, aby powiedzieć RHEL5 z RHEL6 w skrypcie bash?
Idealnie powinien być solidny w różnych głównych wersjach, ale tolerować zmiany w mniejszych numerach wydań.
lsb_release
działa? (-r
powinien podać ci tylko numer; spróbuj także-a
zobaczyć wszystko, co jest dostępne). Jeśli tak, to również między sprzedawcami.git
modułu Bash, przed wywołaniem sprawdzasz, czy istnieje. Kiedy pojawi się / jeśli pojawi się później, wyniki czeku zmieniają się, więc nagle funkcja zaczyna działać, bez dodatkowego wysiłku.lsb_release -r
zawiera także inny tekst, npRelease: 5.8
. Jak wyjaśnia Dennis Kaarsemaker , jeśli użyjeszlsb_release -rs
zamiast tego, otrzymasz tylko numer.Odpowiedzi:
Możesz także użyć
lsb_release
polecenia. Jeśli jesteś już pewien, że to RHEL, uzyskanie głównego numeru wersji to:źródło
lsb_release
na moich maszynach RHEL / CentOS 5. Nigdzie nie można go znaleźć 6 lub 7.To byłby najprostszy sposób, jaki mogę wymyślić.
źródło
lsb_release
które wydają się działać tylko dla 5.Posługiwać się
rpm -q |grep redhat-release-server
/etc/redhat-release
Plik może być edytowany przez administratora chce zainstalować oprogramowanie innych firm bez wykonywania rzeczywistej uaktualnienie systemu operacyjnego.źródło
rpm -qa
zamiastrpm -q
?-q
Samo użycie wymaga argumentu zapytania.7.4
dopóki nie uruchomiłem tego z-qa
Możesz rozwinąć tę kwestię dla wielu dystrybucji Linuksa, używając
/etc/issue
pliku zamiast/etc/redhat-release
pliku.źródło
rpm -q --queryformat '%{RELEASE}' rpm
drukuje coś podobnego25.el7
. W takim razie wystarczy wziąć ostatnią cyfrę (cyfry). Testowane na RHEL 5,6,7 i Fedora 24.Jak zauważyli inni,
lsb-version
może nie zostać zainstalowany. Ponadto istnieje co najmniej jeden system RHEL5, który nie maredhat-release-server
zainstalowanego pakietu.źródło
Oto kolejny, bardziej precyzyjny sposób na uzyskanie tego wyniku. Pakiety jądra w RHEL zawierają ciąg „elN”, gdzie N reprezentuje główną wersję systemu operacyjnego. Dlatego można uruchomić następującą komendę, aby zidentyfikować wersję RHEL:
Zwróci to ciąg „el5”, „el6” lub „el7”, w zależności od pasującego ciągu na danym hoście.
źródło
Skończyło się na tym, że użyłem odpowiedzi Jordana , ale dodałem własny zwrot.
Ponieważ nie chciałem mieć wszystkich moich poleceń rhel6 razem i wszystkich moich poleceń rhel5 razem, ale przeplatałem się we własnej sekcji i nie chciałem replikować tego kodu za każdym razem, gdy chciałem się przełączyć, zamiast tego zrobił to:
W ten sposób mogłem robić takie rzeczy jak:
itp.
źródło
jeśli twoim dalszym intencją jest zarządzanie plikami modułów na podstawie kontekstu, sugeruję sprawdzenie EasyBuild i niektórych powiązanych logik, żyjących w formacie Python:
źródło
Wszystkie wymienione tu metody opierają się na plikach tekstowych i jako takie mogą wprowadzać w błąd. Ktoś z odpowiednim dostępem może zmienić zawartość / etc / redhat-release, / etc / issue itp., Nawet po prostu zaciemniając tę informację. Bardziej niezawodna metoda polegałaby na znajomości wydań jądra zwykle dostarczanych przez Red Hat w każdej wersji RHEL:
niezmiennie do tej pory możesz dowiedzieć się, która wersja jądra jest uruchomiona
uname -r
. Możesz stać się bardziej elegancki, uruchamiając coś w styluDałoby to konkretne informacje o jądrze, jak w powyższej tabeli. Możesz być w stanie doprowadzić równoległe do innych dystrybucji, jeśli konsekwentnie używają wydań jądra.
źródło
RHEL 6 dodał plik / etc / system-release-cpe. Zawiera
:
rozdzielony ciąg, który może wyglądać podobnieTeraz wystarczy pobrać pola 5 i 7 USD, aby uzyskać wersję RHEL i wariant RHEL.
źródło
Począwszy od RHEL 6, najbardziej zwięzłym sposobem byłoby:
źródło
cut -d: -f5 /etc/system-release-cpu
miałoby to być „najbardziej zwięzłe”, zrobiłbyś to i unikał UUOC. Pytanie dotyczyło jednak przejścia z wersji RHEL 5 na 6. Jeśli to działa tylko od wersji RHEL 6, czy nie spełnia wymagań dotyczących pytania?