Trabajo en un entorno en el que estamos haciendo una transición lenta de máquinas de Red Hat Enterprise Linux 5 a RHEL 6.
Necesito algunos de mis scripts para hacer algo sutilmente diferente en las máquinas RHEL6 a lo que se está haciendo actualmente en las máquinas RHEL5.
La solución pragmática es verificar en tiempo de ejecución y ejecutar algunos comandos en RHEL5, otros en RHEL6 y algunos en ambos.
Un ejemplo práctico de esto es que estamos usando módulos de entorno y mi .bashrc
incluye una module load git
línea, pero en las máquinas RHEL6, este error de comando:
RHEL6 system, git should be installed - not loading module
Buscando en el archivo de módulo encuentro el siguiente código:
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 {
...
}
Esto parece hacer lo que quiero, pero esperaba algo más corto.
Entonces, ¿cuál es la forma más fácil de distinguir RHEL5 de RHEL6 en un script bash?
Idealmente, debería ser robusto en las diferentes versiones principales, pero tolerar las variaciones en los números de versiones menores.
lsb_release
el trabajo? (-r
debería darte solo el número; intenta también-a
ver todo lo que esté disponible) Si es así, también es un proveedor cruzado.git
módulo Bash, verifique si existe antes de llamarlo. Cuando / si aparece más tarde, los resultados de su verificación cambian, por lo que de repente la función comienza a funcionar, sin ningún esfuerzo adicional.lsb_release -r
incluye otro texto, por ejemploRelease: 5.8
. Como Dennis Kaarsemaker explica , sin embargo, si se utilizalsb_release -rs
en su lugar, se obtiene sólo el número.Respuestas:
También puedes usar el
lsb_release
comando. Si ya está seguro de que es RHEL, obtener el número de versión principal es:fuente
lsb_release
en mis máquinas RHEL / CentOS 5. No se encuentra en ninguna parte el 6 o 7.Esta sería la forma más simple en que puedo pensar.
fuente
lsb_release
que parece funcionar solo para 5.Utilizar
rpm -q |grep redhat-release-server
El
/etc/redhat-release
archivo podría haber sido editado por un administrador que busca instalar software de terceros sin realizar una actualización real del sistema operativo.fuente
rpm -qa
lugar derpm -q
? El uso-q
por sí solo requiere un argumento de consulta.7.4
hasta que corrí con esto-qa
Puede ampliar esto para múltiples distribuciones de Linux utilizando el
/etc/issue
archivo en lugar del/etc/redhat-release
archivo.fuente
rpm -q --queryformat '%{RELEASE}' rpm
imprime algo así25.el7
. Entonces es solo cuestión de tomar los últimos dígitos. Probado en RHELs 5,6,7 y Fedora 24.Como otros señalaron,
lsb-version
no se puede instalar. Además, hay al menos un sistema RHEL5 que no tiene elredhat-release-server
paquete instalado.fuente
Aquí hay otra forma más precisa de obtener este resultado. Los paquetes del kernel en RHEL tienen la cadena 'elN' incluida, donde N representaría la versión principal del sistema operativo. Por lo tanto, se podría ejecutar el siguiente comando para identificar la versión de RHEL:
Esto devolvería una cadena, "el5", "el6" o "el7", dependiendo de la cadena coincidente en el host dado.
fuente
Terminé usando la respuesta de Jordan , pero añadiendo un giro propio.
Debido a que no quería tener todos mis comandos rhel6 juntos y todos mis comandos rhel5 juntos, pero intercalado dentro de su propia sección, y no quería tener que replicar este código cada vez que deseaba cambiar, en su lugar hice esto:
De esa manera, podría hacer cosas como:
etc.
fuente
Si su intención adicional es administrar archivos de módulo por contexto, le sugiero que consulte EasyBuild y alguna lógica relacionada, viviendo en formato Python:
fuente
Todos los métodos mencionados aquí se basan en archivos de texto, y como tal podrían ser engañosos. Alguien con el acceso correcto puede cambiar el contenido de / etc / redhat-release, / etc / issue, etc. incluso para ofuscar esta información. Un método más confiable implicaría conocer las versiones del kernel que generalmente proporciona Red Hat en cada versión de RHEL:
invariablemente hasta ahora, puede encontrar la versión del kernel en ejecución ejecutando
uname -r
. Puede ser más elegante ejecutando algo en la línea deEsto daría la información específica sobre el núcleo, como en la tabla anterior. Es posible que pueda manejar paralelos con otras distribuciones, si usan constantemente versiones de kernel.
fuente
RHEL 6 ha agregado el archivo / etc / system-release-cpe. Contiene una
:
cadena separada que puede verse comoAhora es suficiente extraer los campos $ 5 y $ 7 para obtener la versión RHEL y la variante RHEL.
fuente
A partir de RHEL 6, la forma más concisa sería:
fuente
cut -d: -f5 /etc/system-release-cpu
y evitaría el UUOC. Sin embargo, la pregunta era acerca de la transición de RHEL 5 a 6. Si esto solo funciona desde RHEL 6 en adelante, ¿no falla en satisfacer los requisitos de la pregunta?