Yang ingin saya skrip adalah sesuatu di sepanjang baris:
if [ uname -r is not == highest version of kernel RPM installed ]
then
echo "You need to reboot to use the latest kernel"
fi
Masalahnya adalah, jika outputnya rpm -q kernel
seperti:
kernel-2.6.32-358.10.2.el6.x86_64
kernel-2.6.32-358.6.1.el6.x86_64
... bagaimana saya menentukan mana yang lebih tinggi? Saya tahu semacam string sederhana tidak dapat diandalkan (itu akan mundur dengan contoh ini). Apakah ada jalan pintas dengan rpm atau apakah saya harus menguraikan semuanya dan membandingkannya sendiri?
sort -V
tidak memberikan hasil yang benar?Jawaban:
TL; DR
Upaya ke-3 benar-benar berhasil! Saya meninggalkan 2 upaya pertama sehingga orang lain yang mungkin menemukan T&J ini di masa depan mudah-mudahan akan mendapatkan beberapa wawasan tentang bagaimana non-sepele masalah itu untuk mengurai informasi versi RPM dan menentukan garis keturunan yang datang pertama, kedua, dll.
Percobaan # 1 (OP mengatakan tidak bekerja)
Perintah ini akan mengurutkan output dan memberi Anda urutan versi:
MENGAPA TIDAK BEKERJA: Seseorang yang naif akan berpikir bahwa Anda dapat menggunakan beberapa varian dari
sort
perintah untuk melakukan tugas ini, tetapi ada cukup variabilitas dan ketidakkonsistenan dalam memformat informasi versi aktual untuk RPM tertentu yang hanya tidak dilakukan oleh RPM. t hingga tugas.Percobaan # 2 (OP mengatakan tidak bekerja)
MENGAPA TIDAK BEKERJA: Saya memiliki harapan besar bahwa pendekatan ini akan menghasilkan hasil yang dicari OP, tetapi masalah dengan yang ini seperti yang ditunjukkan oleh @ Joel dalam komentar, adalah bahwa
--last
peralihan hanya mengembalikan hasil yang diurutkan berdasarkan tanggal RPM dipasang.Percobaan # 3
Yang ini pasti akan melakukan pekerjaannya. Saya menemukan serangkaian alat yang disebut RPM Development Tools. Ada 2 alat di suite ini yang akan memberi Anda kemampuan untuk menentukan apakah satu versi RPM lebih baru atau lebih tua dari yang lain.
Jika RPM belum diinstal, Anda dapat melakukannya sebagai berikut:
Alat pertama yang berguna disebut
rpmdev-vercmp
. Alat ini dapat membandingkan 2 nama RPM dan memberi tahu Anda mana yang lebih baru. Sebagai contoh:Setelah menemukan ini, saya siap untuk membuat skrip shell tetapi kemudian menyadari, saya malas, jadi saya menusuk beberapa menit lagi dan menemukan alat lain di suite yang disebut
rpmdev-sort
.Alat ini berbayar. Anda dapat menggunakannya sebagai berikut:
Ada banyak alat di Alat Pengembangan RPM yang mungkin layak untuk dicari orang lain jadi saya daftar mereka di sini untuk referensi di masa mendatang.
Alternatif untuk # 3
Alternatif yang disebutkan OP dalam komentar adalah menggunakan
sort -V
. Itu modal-V
. Aku juga belum pernah mendengar saklar ini. Darisort
halaman manual:Ternyata
sort
memang menyediakan fasilitas untuk mengurutkan nomor versi sehingga Anda juga bisa melakukan pengurutan seperti:sumber
--last
mengurutkan berdasarkan waktu instalasi paket, itu tidak harus menjadi kernel terbaru (jika mereka melakukan instalasi manual rpm dari versi kernel yang lebih rendah, misalnya).Anda benar-benar perlu menggunakan perpustakaan RPM untuk mendapatkan hasil yang baik. Algoritma perbandingan versi ... jelas-jelas rumit. Ini tidak mudah untuk menerapkan kembali di shell, tetapi jika Anda dapat menggunakan Python untuk melakukan perbandingan yang sebenarnya, itu menjadi relatif mudah. Lihat /programming/3206319/how-do-i-compare-rpm-versions-in-python untuk contoh bagaimana melakukannya.
sumber
Saya pikir mengurutkan berdasarkan buildtime cenderung memiliki kasus sudut di mana ia gagal, tidak seperti installtime. Namun, --terakhir lebih rapi.
sumber
--last
tidak akan memberi tahu Anda nomor versi tertinggi tetapi akan memesan berdasarkan tanggal pemasangan. Jadi, Anda dapat melihat versi yang paling baru diinstal:Sebagian besar waktu (kecuali jika mereka melakukan instalasi kernel manual) keduanya harus sama.
Untuk mendapatkannya 100% benar 100% dari waktu, Anda harus mendapatkan dua versi kernel ke
2.6.*
format kemudian hanya memecahnya mulai dari 2,6 (RHEL tidak akan rebase yang secara drastis dalam satu versi, RHEL5 akan selalu berupa kernel 2.6) dan hanya mengulangi setiap baris output rpm (mungkin diurutkan berdasarkan--last
kinerja) dan membandingkan setiap posisi dengan posisi analog dalam versi kernel yang Anda dapatkanuname -r
jika salah satu angka lebih besar dalam string db rpm daripada string uname, segera keluar dengan pesan itu.Untuk membantu Anda di luar sana, ada pertanyaan serupa yang diajukan di sini . Tetapi fungsi itu mengasumsikan notasi desimal murni bertitik, jadi Anda dapat membandingkan posisi angka sebelum tanda hubung (karena hanya ada satu) kemudian gunakan fungsi bash orang tersebut untuk menguji apakah versi tambalan lebih tinggi
uname
daripada dalam string db rpm.sumber