インストールされているトップバージョンのカーネルRPMをプログラムで確認するには?

インストールされているトップバージョンのカーネルRPMをプログラムで確認するには?

私が書きたいスクリプトはこんな感じです。

if [ uname -r is not == highest version of kernel RPM installed ]
then
  echo "You need to reboot to use the latest kernel"
fi

問題は、出力が次rpm -q kernelのような場合です。

kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64

…どちらが高いかどうかを判断するには?私は単純な文字列ソートが信頼できないことを知っています(この例では逆にソートされています)。 rpmのショートカットがありますか?それとも、すべてを直接分析して比較する必要がありますか?

ベストアンサー1

長い話を短く

実際に3回目の試みで成功しました! RPMのバージョン情報を解析し、最初、2番目などの系譜を決定することがどれほど重要であるかについて、問題に関する洞察を得るために、後でこのQ&Aに触れることができる他の人のために、最初の2回の試みをここに残します。

試み#1(OPが機能していないと言う)

このコマンドは出力をソートし、バージョン順に提供します。

$ rpm -q kernel --queryformat "%{VERSION} %{RELEASE}\n"|sort -n
2.6.18 238.12.1.el5
2.6.18 238.19.1.el5
2.6.18 274.12.1.el5
2.6.18 308.8.2.el5

機能しない理由:無邪気な人は、sortこのコマンドのバリエーションを使ってこれを行うことができると思います。ただし、特定の RPM の実際のバージョン情報形式には、操作に適さない変動性と不一致が十分にあります。

試み#2(OPが機能していないと言う)

$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14

機能しない理由:私はOPが探している結果を生成するためにこのアプローチがとても好きですが、@Joelがコメントで指摘したように、このアプローチの問題は、スイッチが--lastRPMインストール日ごとにソートされた結果を返すだけです。

#3をお試しください

これは間違いなく作業を完了します。 RPM開発ツールと呼ばれるツールセットを見つけました。このスイートには、RPMの1つのバージョンが他のバージョンよりも最新であるか、以前のバージョンであるかを確認するための2つのツールがあります。

RPMがまだインストールされていない場合は、次のことができます。

yum install rpmdevtools

最初の便利なツールですrpmdev-vercmp。このツールは、2つのRPM名を比較して、どちらが新しいものかを知ることができます。たとえば、

$ rpmdev-vercmp kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64
0:kernel-2.6.35.14-103.fc14.x86_64 is newer

これを見つけた後、シェルスクリプトを書こうとしましたが、怠惰であることに気づき、数分以上投資して、スイートからrpmdev-sort

このツールは有料です。次のように使用できます。

$ rpm -q kernel | rpmdev-sort 
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64

RPM開発ツールには、他の人が見る価値のあるツールがたくさんあるので、後で参照できるようにここにリストします。

$ rpm -q --queryformat '[%{NAME} %{FILEMODES:perms} %{FILENAMES}\n]' rpmdevtools \
    | grep -E "^.* -..x..x..x " \
    | awk '{print $3}'          \
    | sed 's#/usr/bin/##'       \
    | paste - - -               \
    | column -t

annotate-output   checkbashisms    licensecheck
manpage-alert     rpmargs          rpmdev-bumpspec
rpmdev-checksig   rpmdev-cksum     rpmdev-diff
rpmdev-extract    rpmdev-md5       rpmdev-newinit
rpmdev-newspec    rpmdev-packager  rpmdev-rmdevelrpms
rpmdev-setuptree  rpmdev-sha1      rpmdev-sha224
rpmdev-sha256     rpmdev-sha384    rpmdev-sha512
rpmdev-sort       rpmdev-sum       rpmdev-vercmp
rpmdev-wipetree   rpmelfsym        rpmfile
rpminfo           rpmls            rpmpeek
rpmsodiff         rpmsoname        spectool

#3の代替

コメントでOPが言及した別のオプションは、sort -V.that's a capitalを使用することです-V。私もこのスイッチについて聞いたことがありません。sortマニュアルページから:

-V, --version-sort
       natural sort of (version) numbers within text

sortバージョン番号を並べ替える機能を提供しているため、次のように並べ替えることもできます。

$ rpm -q kernel | sort -V
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64

おすすめ記事