Je travaille dans un environnement où nous effectuons une transition lente des machines de Red Hat Enterprise Linux 5 vers RHEL 6.
J'ai besoin de certains de mes scripts pour faire quelque chose de subtilement différent sur les machines RHEL6 de ce qui se fait actuellement sur les machines RHEL5.
La solution pragmatique consiste à vérifier au moment de l'exécution et à exécuter certaines commandes sur RHEL5, d'autres sur RHEL6 et certaines sur les deux.
Un exemple pratique de ceci est que nous utilisons des modules d'environnement et my .bashrc
inclut une module load git
ligne, mais sur les machines RHEL6, cette erreur de commande:
RHEL6 system, git should be installed - not loading module
En regardant dans le module, 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, quelle est la façon la plus simple de distinguer RHEL5 de RHEL6 dans un script bash?
Idéalement, il devrait être robuste sur différentes versions principales, mais être tolérant aux variations des numéros de version mineurs.
lsb_release
marche? (-r
devrait vous donner juste le numéro; essayez également-a
de voir tout ce qui est disponible). Si c'est le cas, il s'agit également de fournisseurs croisés.git
module Bash, vous vérifiez s'il existe avant de l'appeler. Quand / s'il apparaît plus tard, les résultats de votre vérification changent, donc soudainement la fonctionnalité commence à fonctionner, sans effort supplémentaire.lsb_release -r
comprend également d'autres textes, par exempleRelease: 5.8
. Comme l' explique Dennis Kaarsemaker , si vous utilisez à lalsb_release -rs
place, vous obtenez juste le numéro.Réponses:
Vous pouvez également utiliser la
lsb_release
commande. Si vous êtes déjà certain que c'est RHEL, obtenir le numéro de version principal est:la source
lsb_release
sur mes machines RHEL / CentOS 5. Il est introuvable le 6 ou le 7Ce serait la façon la plus simple à laquelle je peux penser.
la source
lsb_release
ce qui ne semble fonctionner que pour 5.Utilisation
rpm -q |grep redhat-release-server
Le
/etc/redhat-release
fichier aurait pu être modifié par un administrateur cherchant à installer un logiciel tiers sans effectuer une mise à niveau du système d'exploitation réelle.la source
rpm -qa
au lieu derpm -q
? L'utilisation-q
seule nécessite un argument de requête.7.4
que je n'ai pas couru avec-qa
Vous pouvez développer cela pour plusieurs distributions Linux en utilisant le
/etc/issue
fichier au lieu du/etc/redhat-release
fichier.la source
rpm -q --queryformat '%{RELEASE}' rpm
imprime quelque chose comme25.el7
. Il suffit ensuite de prendre le (s) dernier (s) chiffre (s). Testé sur RHEL 5,6,7 et Fedora 24.Comme d'autres l'ont souligné,
lsb-version
peut ne pas être installé. En outre, il existe au moins un système RHEL5 sur lequel leredhat-release-server
package n'est pas installé.la source
Voici une autre façon, plus précise, d'obtenir ce résultat. Les paquets du noyau dans 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:
Cela retournerait une chaîne, "el5", "el6" ou "el7", selon la chaîne correspondante sur l'hôte donné.
la source
J'ai fini par utiliser la réponse de Jordan , mais en ajoutant ma propre touche.
Parce que je ne voulais pas avoir toutes mes commandes rhel6 ensemble et toutes mes commandes rhel5 ensemble, mais entrelacées dans leur propre section, et je ne voulais pas avoir à répliquer ce code chaque fois que je souhaitais changer, au lieu de cela, je a fait ceci:
De cette façon, je pourrais faire des choses comme:
etc.
la source
si votre intention est de gérer les fichiers de modules par contexte, je vous suggère de consulter EasyBuild et une logique connexe, vivant au format Python:
la source
Toutes les méthodes mentionnées ici reposent sur des fichiers texte et, en tant que telles, peuvent être trompeuses. Quelqu'un avec le bon accès peut changer le contenu de / etc / redhat-release, / etc / issue, etc. même pour simplement obscurcir 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'à présent, vous pouvez découvrir la version du noyau en cours d'exécution en exécutant
uname -r
. Vous pouvez devenir plus chic en exécutant quelque chose le long des lignes deCela donnerait les informations spécifiques sur le noyau, comme dans le tableau ci-dessus. Vous pourriez être en mesure de générer des parallèles avec d'autres distributions, si elles utilisent systématiquement les versions du noyau.
la source
RHEL 6 a ajouté le fichier / etc / system-release-cpe. Il contient une
:
chaîne séparée qui peut ressembler à quelque choseMaintenant, il suffit de tirer les champs $ 5 et $ 7 pour obtenir la version RHEL et la variante RHEL.
la source
À partir de RHEL 6, la manière la plus concise serait:
la source
cut -d: -f5 /etc/system-release-cpu
et évitez l'UUOC. Cependant, la question portait sur la transition de RHEL 5 à 6. Si cela ne fonctionne qu'à partir de RHEL 6, cela ne satisfait-il pas aux exigences de la question?