Ich arbeite in einer Umgebung, in der wir langsam Maschinen von Red Hat Enterprise Linux 5 auf RHEL 6 umstellen.
Ich benötige einige meiner Skripte, um auf RHEL6-Maschinen etwas anderes zu tun als derzeit auf RHEL5-Maschinen.
Die pragmatische Lösung besteht darin, zur Laufzeit einige Befehle auf RHEL5, andere auf RHEL6 und einige auf beiden auszuführen.
Ein praktisches Beispiel hierfür ist, dass wir Umgebungsmodule verwenden und my .bashrc
eine module load git
Zeile enthält, auf RHEL6-Computern jedoch die folgenden Befehlsfehler auftreten:
RHEL6 system, git should be installed - not loading module
Im Modulfile finde ich folgenden Code:
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 {
...
}
Dies scheint zu tun, was ich will, aber ich hatte auf etwas Kürzeres gehofft.
Was ist der einfachste Weg, RHEL5 von RHEL6 in einem Bash-Skript zu unterscheiden?
Idealerweise sollte es für verschiedene Hauptversionen robust sein, aber Abweichungen bei kleineren Versionsnummern tolerieren.
lsb_release
Arbeit? (-r
sollte Ihnen nur die Nummer geben; versuchen Sie auch-a
, alle verfügbaren zu sehen) Wenn ja, ist das auch herstellerübergreifend.git
Bash-Modul benötigt, prüfen Sie, ob es vorhanden ist, bevor Sie es aufrufen. Wenn / falls es später erscheint, ändern sich die Ergebnisse Ihres Schecks, sodass die Funktion plötzlich ohne zusätzlichen Aufwand funktioniert.lsb_release -r
enthalten auch anderen Text, zRelease: 5.8
. Wie Dennis Kaarsemaker jedoch erklärtlsb_release -rs
, erhalten Sie nur die Nummer , wenn Sie stattdessen verwenden.Antworten:
Sie können auch den
lsb_release
Befehl verwenden. Wenn Sie bereits sicher sind, dass es sich um RHEL handelt, lautet die Hauptversionsnummer:quelle
lsb_release
auf meinen RHEL / CentOS 5 Maschinen. Es ist nirgendwo zu finden am 6. oder 7.Dies wäre der einfachste Weg, den ich mir vorstellen kann.
quelle
lsb_release
dem nur an der Arbeit scheint für 5.Verwenden
rpm -q |grep redhat-release-server
Die
/etc/redhat-release
Datei könnte von einem Administrator bearbeitet worden sein, der versucht, Software von Drittanbietern zu installieren, ohne ein tatsächliches Betriebssystem-Upgrade durchzuführen.quelle
rpm -qa
stattrpm -q
? Für die Verwendung ist-q
ein Abfrageargument erforderlich.7.4
bis ich das mit-qa
Sie können dies für mehrere Linux-Distributionen erweitern, indem Sie die
/etc/issue
Datei anstelle der/etc/redhat-release
Datei verwenden.quelle
rpm -q --queryformat '%{RELEASE}' rpm
druckt so etwas wie25.el7
. Dann geht es nur noch darum, die letzte (n) Ziffer (n) zu nehmen. Getestet auf RHELs 5,6,7 und Fedora 24.Wie bereits erwähnt,
lsb-version
darf nicht installiert werden. Zusätzlich gibt es mindestens ein RHEL5-System, auf dem dasredhat-release-server
Paket nicht installiert ist.quelle
Hier ist ein weiterer, genauerer Weg, um dieses Ergebnis zu erzielen. In den Kernelpaketen von RHEL ist die Zeichenfolge 'elN' enthalten, wobei N die Hauptversion des Betriebssystems darstellen würde. So könnte man den folgenden Befehl ausführen, um die Version von RHEL zu identifizieren:
Dies würde eine Zeichenfolge "el5", "el6" oder "el7" zurückgeben, abhängig von der übereinstimmenden Zeichenfolge auf dem angegebenen Host.
quelle
Am Ende habe ich Jordanms Antwort verwendet, aber eine eigene Wendung hinzugefügt.
Weil ich nicht alle meine rhel6-Befehle und alle meine rhel5-Befehle zusammen haben wollte, sondern mich innerhalb eines eigenen Abschnitts verschachtelte, und ich wollte diesen Code nicht jedes Mal replizieren müssen, wenn ich wechseln wollte, sondern ich Tat dies:
Auf diese Weise könnte ich Dinge tun wie:
etc.
quelle
Wenn Sie Moduldateien weiterhin kontextbezogen verwalten möchten, empfehlen wir Ihnen, EasyBuild und eine verwandte Logik im Python-Format zu testen:
quelle
Alle hier genannten Methoden basieren auf Textdateien und können daher irreführend sein. Jemand mit dem richtigen Zugriff kann den Inhalt von / etc / redhat-release, / etc / issue usw. ändern, um diese Informationen nur zu verschleiern. Eine zuverlässigere Methode wäre, die Kernel-Releases zu kennen, die normalerweise von Red Hat für jede RHEL-Version bereitgestellt werden:
Bisher können Sie die aktuelle Kernel-Version immer durch Ausführen von ermitteln
uname -r
. Sie werden vielleicht schicker, wenn Sie etwas nach dem Vorbild von ausführenDies würde die spezifischen Informationen über den Kernel liefern, wie in der obigen Tabelle. Sie können möglicherweise Parallelen zu anderen Distributionen herstellen, wenn diese durchgängig Kernel-Releases verwenden.
quelle
RHEL 6 hat die Datei / etc / system-release-cpe hinzugefügt. Dieser enthält eine durch
:
Trennzeichen getrennte Zeichenfolge, die ungefähr so aussehen kannJetzt genügt es, die Felder $ 5 und $ 7 zu ziehen, um die RHEL-Version und die RHEL-Variante zu erhalten.
quelle
Ab RHEL 6 wäre der prägnanteste Weg:
quelle
cut -d: -f5 /etc/system-release-cpu
die UUOC meiden. Die Frage lautete jedoch, ob der Wechsel von RHEL 5 zu 6 erfolgen soll. Wenn dies erst ab RHEL 6 funktioniert, werden die Fragenanforderungen dann nicht nicht nicht erfüllt?