Lo que quiero escribir es algo parecido a:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
El problema es, si la salida de rpm -q kernel
es algo como:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
... ¿Cómo determino cuál es más alto? Sé que un tipo de cadena simple no es confiable (será al revés con este ejemplo). ¿Hay un acceso directo con rpm o tengo que analizar todo y compararlo yo mismo?
sort -V
no da el resultado correcto?Respuestas:
TL; DR
¡El tercer intento realmente funciona! Dejo los primeros 2 intentos para que otros que puedan encontrarse con estas preguntas y respuestas en el futuro tengan alguna idea de cuán no trivial es el problema de analizar la información de la versión RPM y determinar el linaje de los cuales vino primero, segundo, etc.
Intento n. ° 1 (OP dijo que no funcionó)
Este comando ordenará la salida y le dará orden de versión:
POR QUÉ NO FUNCIONÓ: una persona ingenua pensaría que puede usar alguna variante del
sort
comando para realizar esta tarea, pero hay suficiente variabilidad e inconsistencia en el formato de la información de la versión real para un RPM dado que simplemente no es t a la altura de la tarea.Intento n. ° 2 (OP dijo que no funcionó)
POR QUÉ NO FUNCIONÓ: tenía grandes esperanzas de que este enfoque arrojaría los resultados que el OP estaba buscando, pero el problema con este, como señaló @Joel en los comentarios, es que el
--last
cambio solo está devolviendo los resultados ordenados por la fecha en que se instalaron los RPM.Intento n. ° 3
Este definitivamente hará el trabajo. Encontré un conjunto de herramientas llamadas Herramientas de desarrollo RPM. Hay 2 herramientas en esta suite que le permitirán determinar si una versión de un RPM es más nueva o más antigua que otra.
Si el RPM no está instalado, puede hacerlo de la siguiente manera:
La primera herramienta que es útil se llama
rpmdev-vercmp
. Esta herramienta puede comparar 2 nombres de RPM y decirle cuál es más nuevo. Por ejemplo:Después de encontrar esto, estaba listo para armar un script de shell, pero luego me di cuenta, hombre, soy flojo, así que busqué unos minutos más y encontré otra herramienta en la suite llamada
rpmdev-sort
.Esta herramienta es de pago. Puede usarlo de la siguiente manera:
Hay muchas herramientas en las Herramientas de desarrollo de RPM que podrían valer la pena para otras, así que las enumero aquí para referencia futura.
Una alternativa al # 3
Una alternativa que el OP mencionado en los comentarios es usar
sort -V
. Eso es una capital-V
. Nunca había oído hablar de este cambio tampoco. Desde lasort
página del manual:Como resultado
sort
, proporciona una función para ordenar los números de versión para que también pueda realizar la clasificación de la siguiente manera:fuente
--last
ordena por tiempo de instalación del paquete, no necesariamente será el último kernel (si hicieron una instalación manual de rpm de una versión inferior del kernel, por ejemplo).Realmente necesita usar la biblioteca RPM para obtener un buen resultado. El algoritmo de comparación de versiones es ... decididamente complejo. No es trivial volver a implementar en shell, pero si puede usar Python para hacer la comparación real, se vuelve relativamente sencillo. Consulte /programming/3206319/how-do-i-compare-rpm-versions-in-python para ver un ejemplo de cómo hacerlo.
fuente
Creo que es menos probable que ordenar por tiempo de compilación tenga un caso de esquina donde falla, a diferencia del tiempo de instalación. Sin embargo, el último es más ordenado.
fuente
--last
no le dirá el número de versión más alto, pero lo ordenará por fecha de instalación. Para que pueda ver la versión instalada más recientemente:La mayoría de las veces (a menos que hicieran una instalación manual del núcleo) los dos deberían ser los mismos.
Para hacerlo 100% correcto el 100% del tiempo, tendrá que obtener las dos versiones del kernel para
2.6.*
formatearlas y luego dividirlas comenzando después de la 2.6 (RHEL no rebasará drásticamente eso en una sola versión, RHEL5 siempre será un kernel 2.6) e simplemente itere sobre cada línea de salida de rpm (posiblemente ordenada por--last
rendimiento) y compare cada posición con la posición análoga en la versión del kernel que obtuvouname -r
si alguno de los números es mayor en la cadena de rpm db que la cadena uname, salga inmediatamente con ese mensaje.Para ayudarlo, hay una pregunta similar aquí . Pero esa función asume una notación decimal puramente punteada, por lo que puede comparar la posición del número antes del guión (ya que solo hay una) y luego usar la función bash de esa persona para probar si la versión del parche es más alta
uname
que en la cadena rpm db.fuente