スクリプトは、Linuxごとに異なる動作をする必要がある場合があります。スクリプトが実行されているLinuxのバージョンを確認するにはどうすればよいですか?
スクリプトは、Linuxごとに異なる動作をする必要がある場合があります。スクリプトが実行されているLinuxのバージョンを確認するにはどうすればよいですか?
回答:
できることとできないことについて、ディストリビューションに基づいて仮定しようとしないでください。その方法は狂気にあります(「ユーザーエージェントの検出」も参照)。代わりに、やりたいことがサポートされているかどうか、使用したいコマンドやファイルの場所によってそれがどのように行われているかを検出します。
たとえば、パッケージをインストールする場合、dpkgまたはrpmの存在を確認することにより、DebianライクシステムまたはRedHatライクシステムのどちらであるかを検出できます(Debianマシンはそれらのrpmコマンド...)。DebianシステムであるかRedHatシステムであるかだけでなく、それに基づいて何をすべきかを決定してください。そうすれば、明示的にプログラムしなかった派生ディストリビューションを自動的にサポートします。ああ、パッケージに特定の依存関係が必要な場合は、それらもテストして、ユーザーに不足しているものを知らせます。
別の例は、ネットワークインターフェイスをいじる場合です。/ etc / network / interfacesファイルまたは/ etc / sysconfig / network-scriptsディレクトリがあるかどうかに基づいて何をすべきかを判断し、そこから進みます。
はい、それはより多くの作業ですが、Web開発者が過去10年以上に犯したすべての間違いを作り直したいのでなければ、最初からスマートな方法でそれを行います。
クロスディストリビューションの方法はありません。しかしながら:
- Redhat and friends:テスト
/etc/redhat-release
、コンテンツの確認- Debian:のテスト
/etc/debian_version
、内容の確認- マンドリバと友人:テスト
/etc/version
、内容の確認- Slackware:テスト
/etc/slackware-version
、コンテンツの確認
など一般的に言えばチェック/etc/*-release
して/etc/*-version
。
編集:私の周りにある古い(1年以上の)bashスクリプトを発見しました。これは長年にわたって一緒に石畳になったに違いありません(6年前に遡る印象的なCVSログがあります)。テスト対象のインストール済みディストリビューションを見つけるのに煩わされることはありませんが、良い出発点を提供するはずです。CentOS、Fedora、Gentooで正常に動作します。gyaresuはDebian Lennyで正常にテストしました。
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
これはおそらくBashでのみ正しく機能することに注意してください。他のシェル用に書き換えることができます。
そうは言っても、ディストリビューションではなく機能をテストすることをお勧めします。メンテナンスの負担になったからといって、私はもうこれを使用していません。クロスディストリビューションのツールとソリューションに依存する方が簡単です。
概念的には、次の順序で実行されます:
- 既知の「共通の初期化スクリプト関数」タイプのファイルを取り込みます。それらはディストリビューション固有です。存在しない場合は、次の配布チェックにスキップします。
- そのコアスクリプトから、特定の、既存の、よく使用され、名前が変更される可能性の低い特定の存在を確認します。
type
Bashビルトインを使用してこれを行います。そのシンボルが関数である場合にtype -t
返しますfunction
。名前が定義されていない場合、出力文字列が空になり、演算子に左手がないという構文エラーが発生するためzz
、出力の先頭に追加しtype -t 2>/dev/null
ます==
。チェックした名前が関数ではない場合は、次の配信チェックにスキップします。それ以外の場合は、配信タイプが見つかりました。- 最後に、関数出力がcase .. esacブロックで簡単に使用できるように、分布タイプをエコーします。
これを単純なスクリプトとして実行しようとしている場合に編集します。このスクリプトは、他のスクリプトからソースを取得するか、含まれるようになっています。そのまま実行した場合、それ自体は何も出力しません。テストするには、ソースを指定してから関数を呼び出します。例:
source /path/to/this/script.sh
get_distribution_type
bashプロンプトで。
編集:このスクリプトはルート権限を必要としないことに注意してください。rootとして実行しないことをお勧めします。何も害はないはずですが、必要はありません。
CVSログに関連するメーリングリストの投稿へのリンクが見つかりました。initスクリプトスパゲッティの展開に役立つはずです。
を実行するとuname -a
、カーネルのバージョンを見つけることができます。ディストリビューションのバージョンはディストリビューションに依存しています。
Ubuntuおよびその他のOSでは、lsb_release -a
/ etc / lsb_releaseを実行または読み取ることができます
Debianはバージョンを/ etc / debian_versionに保存します
ほとんどのディストリビューションには、特定の分布を決定する独自の方法があります。
例えば:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Linux Standard BaseまたはLSBとして知られる標準があります。Linuxディストリビューションに関する情報をエコーバックする/ etc / lsb-releaseと呼ばれるファイルまたはlsb_releaseと呼ばれるプログラムがあることを定義しています。
lsb_release -a
lsb_release
CentOS 6には存在しません。-
python -c 'import platform ; print platform.dist()[0]'
python -c 'import platform; print(platform.dist()[0])'
ます。これは、通常のpythonのデフォルトがpython3の場合にも機能するためです。
必要uname -a
なのは、お気に入りのシェルで入力するだけです。これにより、カーネル名とバージョンが出力されます。
私はマーク、アダム、ミハイに同意します(評判が不十分なため、投票できません)。LSBとその関連FHSに基づくソリューションは、ほとんどのディストリビューションで機能し、今後も機能し続ける可能性があります。LSBとFHSはあなたの友達です。
Linuxのバージョンは難しい質問です。よく見ると、「uname -r
」で取得できるカーネルバージョンがあります。配布バージョンはほとんど無関係です。一部のディストリビューションの方が優れています(Redhat Enterprise Linuxなどのエンタープライズディストリビューション)。Gentooのような他のディストリビューションは、基本的には賢明なバージョンをまったく持たない移動ターゲットです。バージョンに基づいて物事を行う必要がある場合は、あなたに関連する主要なコンポーネントを見てください。
Component Version command
glibc /lib/libc.so.6
gcc gcc --version
X xdpyinfo
libX11 pkg-config --modversion x11
gtk+ pkg-config --modversion gtk+-2.0
qt-4 pkg-config --modversion QtCore
etc...
また、Grubメニューを確認することもできます。通常は、多くのディストリビューション/バージョン情報が表示されます:-)
FusionInventoryは、多くのLinuxディストリビューションだけでなく、BSD、Windows、MacOS X、その他のユニックスでもこの情報を取得できるクロスプラットフォームの軽量インベントリツールです。
使用可能な場合はlsb_release
(上記で何度か述べたように)使用しますが、そうでない場合は、ディストリビューションの名前とバージョンを確認するための非常に便利なファイルと正規表現のリストがあります:https : //github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / FusionInventory / Agent / Task / Inventory / Input / Linux / Distro / NonLSB.pm#L16。
このロジックを使用して独自のスクリプトを再実装するのではなく、FusionInventory自体を使用してこの情報を取得することをお勧めします。コミュニティがこの機能を最新に維持しているためです。エージェントを単独で使用するか(解析しやすいXML / JSONファイルを出力する)、または必要に応じてGLPIやRudderなどのネットワーク内のマシンを管理するためのより広範なソリューションと組み合わせることができます。