私は、マシンをRed Hat Enterprise Linux 5からRHEL 6に徐々に移行している環境で働いています。
RHEL6マシンでRHEL5マシンで現在実行されているものと微妙に異なる何かを実行するには、スクリプトの一部が必要です。
実用的なソリューションは、実行時にチェックし、RHEL5でいくつかのコマンドを実行し、RHEL6で他のコマンドを実行し、両方でいくつかのコマンドを実行することです。
この実用的な例は、環境モジュールを使用していて、_.bashrc
にmodule load git
行が含まれていることですが、RHEL6マシンでは次のコマンドエラーが発生します。
RHEL6 system, git should be installed - not loading module
Modulefileを見ると、次のコードが見つかります。
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 {
...
}
これは私がやりたいことをしているようですが、もっと短いものを望んでいました。
では、bashスクリプトでRHEL6からRHEL5を識別する最も簡単な方法は何ですか?
理想的には、さまざまなメジャーバージョン間で堅牢である必要がありますが、マイナーリリース番号の変動には耐性があります。
lsb_release
コマンドを使用することもできます。 RHELであることが既にわかっている場合は、メジャーバージョン番号を取得します。
majversion=$(lsb_release -rs | cut -f1 -d.)
if grep -q -i "release 6" /etc/redhat-release
then
echo "running RHEL 6.x"
fi
これは私が考えることができる最も簡単な方法でしょう。
使用する rpm -q |grep redhat-release-server
/etc/redhat-release
ファイルは、実際のOSアップグレードを実行せずにサードパーティソフトウェアをインストールしようとしている管理者によって編集された可能性があります。
/etc/issue
ファイルの代わりに/etc/redhat-release
ファイルを使用して、複数のLinuxディストリビューションでこれを拡張できます。
major_version=$(rpm -q --queryformat '%{RELEASE}' rpm | grep -o [[:digit:]]*\$)
rpm -q --queryformat '%{RELEASE}' rpm
は25.el7
のようなものを出力します。次に、最後の桁を取るだけです。 RHEL 5、6、7およびFedora 24でテスト済み。
他の人が指摘したように、lsb-version
がインストールされていない可能性があります。さらに、redhat-release-server
パッケージがインストールされていないRHEL5システムが少なくとも1つあります。
これは、この結果を得る別のより正確な方法です。 RHELのカーネルパッケージには文字列「elN」が含まれています。NはOSのメジャーバージョンを表します。したがって、次のコマンドを実行してRHELのバージョンを特定できます。
# uname -r | sed 's/^.*\(el[0-9]\+\).*$/\1/'
これは、指定されたホスト上の一致する文字列に応じて、文字列「el5」、「el6」、または「el7」を返します。
ここで説明する方法はすべてテキストファイルに依存しているため、誤解を招く可能性があります。正しいアクセス権を持つ誰かが/ etc/redhat-releaseや/ etc/issueなどの内容を変更して、この情報を単に難読化することさえあります。より信頼できる方法は、RHELの各バージョンでRed Hatが通常提供するカーネルリリースを知ることです。
現在まで常に、uname -r
を実行すると、実行中のカーネルリリースを確認できます。あなたはの線に沿って何かを実行することにより、より精巧になるかもしれません
uname -r | awk -F- '{print $1}'
これにより、上記の表のように、カーネルに関する特定の情報が得られます。他のディストリビューションがカーネルリリースを一貫して使用している場合は、他のディストリビューションへの並列処理を実行できる可能性があります。
RHEL 6以降、最も簡潔な方法は次のようになります。
cat /etc/system-release-cpe | cut -d ':' -f5
モジュールファイルをコンテキストベースで管理することをさらに意図している場合は、EasyBuildといくつかの関連ロジックをチェックして、Python形式で確認することをお勧めします。
RHEL 6は/ etc/system-release-cpeファイルを追加しました。これには:
で区切られた文字列。
# cat /etc/system-release-cpe
cpe:/o:redhat:enterprise_linux:6computenode:ga:computenode
RHELバージョンとRHELバリアントを取得するには、フィールド$ 5と$ 7をプルするだけで十分です。
# will be 7 or 6, does not work for 5 as file is missing there
RHEL_VERSION_MAJOR=$(cat /etc/system-release-cpe | awk -F: '{ print $5 }' | grep -o ^[0-9]*)
RHEL_VARIANT=$(cat /etc/system-release-cpe | awk -F: '{ print $7 }')
私は jordanm sの答えを使用することになりましたが、自分のひねりを加えました。
すべてのrhel6コマンドとすべてのrhel5コマンドを一緒にしたくはなかったが、独自のセクション内にインターリーブし、切り替えを待つたびにこのコードを複製する必要がなかったので、代わりにこれを行いました:
if grep -q -i "release 6" /etc/redhat-release ; then
rhel6only=1
Elif grep -q -i "release 5" /etc/redhat-release ; then
rhel5only=1
else
echo "Running neither RHEL6.x nor RHEL 5.x !"
fi
そうすれば、次のようなことができます。
# JDK
[ $rhel5only ] && module load Java/6
[ $rhel6only ] && module load Java/7
# Eclipse
module load Eclipse
# Python
[ $rhel5only ] && module load python/2
[ $rhel6only ] && module load python/3
等.