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.
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.
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.
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.
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é.
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é.
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:
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.
À partir de Rhel 6, la manière la plus concise serait:
cat /etc/system-release-cpe | cut -d ':' -f5
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:
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 }')
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.