web-dev-qa-db-fra.com

Comment savoir quelle version de Rhel j'utilise?

Je travaille dans un environnement où nous transitions lentement des machines de Red Hat Enterprise Linux 5 à Rhel 6.

J'ai besoin de certains de mes scripts pour faire quelque chose subtilement différent des machines RHEL6 à ce qui est actuellement fait sur des machines RHEL5.

La solution pragmatique consiste à vérifier au moment de l'exécution et à exécuter des commandes sur RHEL5, d'autres sur RHEL6 et certaines sur les deux.

Un exemple pratique en est que nous utilisons des modules d'environnement et mon .bashrc comprend un module load git ligne, mais sur les machines RHEL6, ces erreurs de commande:

RHEL6 system, git should be installed - not loading module

En regardant dans le modulefile, je trouve le code suivant:

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 {
  ...
}

Cela semble faire ce que je veux, mais j'espérais quelque chose de plus court.

Alors, quel est le moyen le plus simple de dire RHEL5 de RHEL6 dans un script Bash?

Idéalement, il devrait être robuste sur différentes versions majeures, mais être tolérante des variations de nombres mineurs de libération.

14
Mark Booth
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

Ce serait la façon la plus simple que je puisse penser.

15
MelBurslan

Utilisation rpm -q |grep redhat-release-server

Les /etc/redhat-release Fichier aurait pu être modifié par un administrateur qui cherche à installer des logiciels tiers sans effectuer une mise à niveau réelle du système d'exploitation.

4
BillMal

Vous pouvez développer ce problème pour plusieurs distributions de Linux en utilisant le /etc/issue Fichier au lieu de /etc/redhat-release déposer.

2
Brian W
major_version=$(rpm -q --queryformat '%{RELEASE}' rpm | grep -o [[:digit:]]*\$)

rpm -q --queryformat '%{RELEASE}' rpm imprime quelque chose comme 25.el7. Ensuite, il suffit de prendre le dernier chiffre (s). Testé sur Rhels 5,6,7 et Fedora 24.

Comme d'autres ont souligné, lsb-version Peut ne pas être installé. De plus, il y a au moins un système RHEL5 qui n'a pas le redhat-release-server Package installé.

2
user7610

Voici un autre moyen plus précis d'obtenir ce résultat. Les forfaits du noyau de Rhel ont la chaîne 'Eln' incluse, où n représenterait la version principale du système d'exploitation. Ainsi, on pourrait exécuter la commande suivante pour identifier la version de RHEL:

# uname -r | sed 's/^.*\(el[0-9]\+\).*$/\1/'

Cela rendrait une chaîne "EL5", "EL6" ou "EL7", en fonction de la chaîne correspondante de l'hôte donné.

1
Brād Axe

Toutes les méthodes mentionnées ici s'appuient ici sur des fichiers texte, et comme telles pourraient être trompeuses. Certainon avec le bon accès peut changer le contenu de/etc/redhat-libération,/etc/problème, etc., même pour vomir ces informations. Une méthode plus fiable impliquerait de connaître les versions du noyau généralement fournies par Red Hat sur chaque version de Rhel:

  • RHEL4 utilise le noyau 2.6.9-X
  • Rhel5 utilise le noyau 2.6.18-X
  • RHEL6 utilise le noyau 2.6.32-X
  • RHEL7 utilise le noyau 3.10.0-X

invariablement jusqu'à maintenant, vous pouvez découvrir la sortie du noyau en cours d'exécution uname -r. Vous pouvez avoir plus envie en courant quelque chose dans le sens de

uname -r | awk -F- '{print $1}'

Cela donnerait aux informations spécifiques sur le noyau, comme dans le tableau ci-dessus. Vous pourriez être en mesure de conduire des parallèles à d'autres distributions, s'ils utilisent systématiquement des versions de noyau.

0
Brād Axe

À partir de Rhel 6, la manière la plus concise serait:

cat /etc/system-release-cpe | cut -d ':' -f5
0
trinth

si votre autre intention est de gérer les modulefiles par contexte, je vous suggère de vérifier EasyBuild et de la logique associée, vivant dans Python Format:

0
fgeorgatos

RHEL 6 a ajouté le fichier/etc/System-version-CPE. Cela contient un :- chaîne séparée qui peut ressembler à quelque chose comme

# cat /etc/system-release-cpe
cpe:/o:redhat:enterprise_linux:6computenode:ga:computenode

Maintenant, il suffit de tirer les champs de 5 $ et de 7 $ pour obtenir la version Rhel et Rhel Variante.

# will be 7 or 6, does not work for 5 as file is missing there
RHEL_VERSION_MAJOR=$(cat /etc/system-release-cpe | awk -F: '{ print $5 }' | grep -o ^[0-9]*)
RHEL_VARIANT=$(cat /etc/system-release-cpe | awk -F: '{ print $7 }')
0
user7610

J'ai fini par utiliser Jordanm réponse, mais ajoutant une torsion de la mienne.

Parce que je ne voulais pas avoir toutes mes commandes Rhel6 ensemble et toutes mes commandes RHEL5 ensemble, mais entrelées dans leur propre section, et je ne voulais pas avoir à reproduire ce code chaque fois que je détermine changer, mais je a fait ceci:

if   grep -q -i "release 6" /etc/redhat-release ; then
  rhel6only=1
Elif grep -q -i "release 5" /etc/redhat-release ; then
  rhel5only=1
else
  echo "Running neither RHEL6.x nor RHEL 5.x !"
fi

De cette façon, je pourrais faire des choses comme:

# JDK
[ $rhel5only ] && module load Java/6
[ $rhel6only ] && module load Java/7

# Eclipse
module load Eclipse

# Python
[ $rhel5only ] && module load python/2
[ $rhel6only ] && module load python/3

etc.

0
Mark Booth