Saya bekerja di lingkungan di mana kami secara perlahan mentransisikan mesin dari Red Hat Enterprise Linux 5 ke RHEL 6.
Saya memerlukan beberapa skrip untuk melakukan sesuatu yang sedikit berbeda pada mesin RHEL6 dengan apa yang saat ini dilakukan pada mesin RHEL5.
Solusi pragmatis adalah memeriksa pada saat runtime dan menjalankan beberapa perintah di RHEL5, yang lain di RHEL6 dan beberapa di keduanya.
Contoh praktisnya adalah kita menggunakan modul lingkungan dan saya .bashrc
menyertakan module load git
baris, tetapi pada mesin RHEL6 kesalahan perintah ini:
RHEL6 system, git should be installed - not loading module
Mencari di modulefile saya menemukan kode berikut:
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 {
...
}
Ini tampaknya melakukan apa yang saya inginkan, tetapi saya berharap untuk sesuatu yang lebih pendek.
Jadi, apa cara termudah untuk memberi tahu RHEL5 dari RHEL6 dalam skrip bash?
Idealnya itu harus kuat di berbagai versi utama, tetapi toleran terhadap variasi dalam jumlah rilis kecil.
lsb_release
bekerja? (-r
Seharusnya memberi Anda hanya nomor; coba juga-a
untuk melihat semua yang tersedia) Jika demikian, itu juga cross-vendor.git
modul Bash, Anda memeriksa apakah ada sebelum memanggilnya. Ketika / jika muncul nanti, hasil cek Anda berubah, jadi tiba-tiba fitur mulai bekerja, tanpa usaha ekstra.lsb_release -r
menyertakan teks lain, misRelease: 5.8
. Seperti yang dijelaskan Dennis Kaarsemaker , jika Anda menggunakannyalsb_release -rs
, Anda hanya mendapatkan nomornya.Jawaban:
Anda juga dapat menggunakan
lsb_release
perintah. Jika Anda sudah yakin itu RHEL, mendapatkan nomor versi utama adalah:sumber
lsb_release
di mesin RHEL / CentOS 5 saya. Tidak ada tempat untuk ditemukan pada 6 atau 7.Ini akan menjadi cara paling sederhana yang dapat saya pikirkan.
sumber
lsb_release
yang tampaknya hanya berfungsi untuk 5.Menggunakan
rpm -q |grep redhat-release-server
The
/etc/redhat-release
berkas bisa telah diedit oleh admin mencari untuk menginstal perangkat lunak pihak ketiga tanpa melakukan upgrade OS yang sebenarnya.sumber
rpm -qa
alih-alihrpm -q
? Menggunakannya-q
sendiri membutuhkan argumen kueri.7.4
sampai saya menjalankan ini dengan-qa
Anda dapat memperluas ini untuk beberapa distro Linux dengan menggunakan
/etc/issue
file, bukan/etc/redhat-release
file.sumber
rpm -q --queryformat '%{RELEASE}' rpm
mencetak sesuatu seperti25.el7
. Maka tinggal ambil digit terakhir saja. Diuji pada RHELs 5,6,7 dan Fedora 24.Seperti yang ditunjukkan orang lain,
lsb-version
mungkin tidak diinstal. Selain itu, setidaknya ada satu sistem RHEL5 yang tidak memilikiredhat-release-server
paket yang diinstal.sumber
Inilah cara lain yang lebih tepat untuk mendapatkan hasil ini. Paket-paket kernel di RHEL menyertakan string 'elN', di mana N akan mewakili versi utama OS. Dengan demikian, seseorang dapat menjalankan perintah berikut untuk mengidentifikasi versi RHEL:
Ini akan mengembalikan string, "el5", "el6" atau "el7", tergantung pada string yang cocok pada host yang diberikan.
sumber
Saya akhirnya menggunakan jawaban jordanm , tetapi menambahkan twist saya sendiri.
Karena saya tidak ingin memiliki semua perintah rhel6 saya bersama-sama dan semua perintah rhel5 saya bersama-sama, tetapi disatukan dalam bagian mereka sendiri, dan saya tidak ingin harus mereplikasi kode ini setiap kali saya ingin beralih, sebagai gantinya saya melakukan ini:
Dengan begitu, saya bisa melakukan hal-hal seperti:
dll.
sumber
jika niat Anda selanjutnya adalah mengelola modulefile berdasarkan konteks, saya sarankan Anda memeriksa EasyBuild dan beberapa logika terkait, yang hidup dalam format Python:
sumber
Semua metode yang disebutkan di sini bergantung pada file teks, dan karenanya bisa menyesatkan. Seseorang dengan akses yang tepat dapat mengubah isi / etc / redhat-release, / etc / issue, dll. Bahkan hanya untuk mengaburkan informasi ini. Metode yang lebih andal akan melibatkan mengetahui rilis kernel yang biasanya disediakan oleh Red Hat pada setiap versi RHEL:
selalu sampai sekarang, Anda dapat mengetahui rilis kernel yang berjalan dengan menjalankan
uname -r
. Anda bisa menjadi pelamun dengan menjalankan sesuatu di sepanjang garisIni akan memberikan informasi spesifik tentang kernel, seperti pada tabel di atas. Anda mungkin dapat mengarahkan paralel ke distribusi lain, jika mereka secara konsisten menggunakan rilis kernel.
sumber
RHEL 6 telah menambahkan file / etc / system-release-cpe. Ini berisi
:
string terpisah yang mungkin terlihat sepertiSekarang cukup untuk menarik bidang $ 5 dan $ 7 untuk mendapatkan versi RHEL dan varian RHEL.
sumber
Mulai dari RHEL 6, cara yang paling ringkas adalah:
sumber
cut -d: -f5 /etc/system-release-cpu
dan menghindari UUOC. Namun, pertanyaannya adalah tentang transisi dari RHEL 5 ke 6. Jika ini hanya bekerja dari RHEL 6 dan seterusnya, apakah itu tidak memenuhi persyaratan pertanyaan?