O que eu quero escrever é algo como:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
O problema é que, se a saída de rpm -q kernel
é algo como:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
… Como eu determino qual é mais alto? Eu sei que uma classificação simples de string não é confiável (será retrocedida neste exemplo). Existe um atalho com rpm ou eu tenho que analisar tudo e comparar eu mesmo?
sort -V
não dá resultado correto?Respostas:
TL; DR
A terceira tentativa realmente funciona! Estou deixando as duas primeiras tentativas para que outras pessoas que se deparem com essas perguntas e respostas no futuro esperem ter uma ideia de como é um problema não trivial analisar as informações da versão do RPM e determinar a linhagem que veio primeiro, segundo, etc.
Tentativa 1 (OP disse que não funcionou)
Este comando classificará a saída e fornecerá a você em ordem de versão:
POR QUE NÃO FUNCIONOU: Uma pessoa ingênua pensaria que você pode usar alguma variante do
sort
comando para executar esta tarefa, mas há variabilidade e inconsistência suficientes na formatação das informações reais da versão para um determinado RPM que simplesmente não são '' até a tarefa.Tentativa 2 (OP disse que não funcionou)
POR QUE NÃO FUNCIONOU: Eu tinha grandes esperanças de que essa abordagem produzisse os resultados que o OP estava procurando, mas o problema com esse como o @Joel apontou nos comentários, é que a
--last
opção está apenas retornando os resultados classificados por a data em que os RPMs foram instalados.Tentativa nº 3
Este definitivamente fará o trabalho. Encontrei um conjunto de ferramentas chamado RPM Development Tools. Existem duas ferramentas neste conjunto que permitem determinar se uma versão de um RPM é mais recente ou mais antiga que outra.
Se o RPM ainda não estiver instalado, faça o seguinte:
A primeira ferramenta útil é chamada
rpmdev-vercmp
. Essa ferramenta pode comparar dois nomes de RPMs e dizer qual é o mais novo. Por exemplo:Depois de descobrir isso, estava pronto para montar um script de shell, mas depois percebi, cara, sou preguiçoso, então cutuquei mais alguns minutos e encontrei outra ferramenta na suíte chamada
rpmdev-sort
.Esta ferramenta é uma sujeira. Você pode usá-lo da seguinte maneira:
Existem muitas ferramentas nas Ferramentas de Desenvolvimento RPM que podem valer a pena procurar outras pessoas, por isso estou listando-as aqui para referência futura.
Uma alternativa ao # 3
Uma alternativa que o OP mencionado nos comentários é usar
sort -V
. Isso é uma capital-V
. Eu nunca tinha ouvido falar dessa mudança também. Nasort
página do manual:Acontece que
sort
ele fornece um recurso para classificar os números de versão para que você também possa executar a classificação da seguinte forma:fonte
--last
classifica pelo tempo de instalação do pacote, não será necessariamente o kernel mais recente (se eles fizeram uma instalação manual do rpm de uma versão mais baixa do kernel, por exemplo).Você realmente precisa usar a biblioteca RPM para obter um bom resultado. O algoritmo de comparação de versões é ... decididamente complexo. Não é trivial reimplementar no shell, mas se você pode usar o Python para fazer a comparação real, isso se torna relativamente simples. Consulte /programming/3206319/how-do-i-compare-rpm-versions-in-python para obter um exemplo de como fazer isso.
fonte
Eu acho que a classificação por tempo de construção é menos provável de ter um caso de canto onde falha, ao contrário do tempo de instalação. No entanto, --último é mais arrumado.
fonte
--last
não informará o número da versão mais alta, mas será solicitado por data de instalação. Então você pode ver a versão mais recente instalada:Na maioria das vezes (a menos que eles tenham feito uma instalação manual do kernel), os dois devem ser os mesmos.
Para acertar 100% em 100% do tempo, você terá que baixar as duas versões do kernel para
2.6.*
formatar e depois desmembrá-las a partir do 2.6 (o RHEL não irá rebater drasticamente isso em uma única versão, o RHEL5 sempre será um kernel 2.6) e apenas itere sobre cada linha de saída rpm (possivelmente classificada por--last
desempenho) e compare cada posição com a posição análoga na versão do kernel que você obteve,uname -r
se algum número for maior na string do rpm db que a cadeia uname, saia imediatamente com essa mensagem.Para ajudá-lo, existe uma pergunta semelhante aqui . Mas essa função assume uma notação decimal puramente pontilhada; portanto, você pode comparar a posição numérica antes do hífen (já que existe apenas uma) e usar a função bash dessa pessoa para testar se a versão do patch é maior do
uname
que na sequência rpm db.fonte