2010年7月24日土曜日

alternatives によるコマンドの切り替え


このエントリーをはてなブックマークに追加


例えば、javaにはOpenJavaやSun Javaといった同じ機能を提供するが、提供元が異なるものがある。
両者を異なる場所にインストールして、パスの順序で制御してもいいんだけど、
javaみたいにCLASSPATH等のパス以外の環境変数がかかわってくるケースだと非常に煩わしい。
他にもsendmail と Postfixなんてもの代表的な切換えが面倒なソフトだ。

そのため、RedHat系にalternativesというコマンドがインストールされており、こういったケースに対応できるようになっている。




[root@hdp01 ~]# which java
/usr/bin/java

[root@hdp01 ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22  7月 22 21:12 /usr/bin/java -> /etc/alternatives/java

[root@hdp01 ~]# ll /etc/alternatives/java
lrwxrwxrwx 1 root root 39  7月 22 21:12 /etc/alternatives/java -> /usr/lib/jvm/jre-1.6.0-openjdk/bin/java

こんな感じでjavaは/usr/bin配下にあるようにみえるが、実態はalternatvesのシンボリックリンクを経由した先にある。

この状態を調べるには、


[root@hdp01 ~]# alternatives --display java
java -ステータスは自動です。
リンクは現在 /usr/lib/jvm/jre-1.6.0-openjdk/bin/java を指しています。
/usr/lib/jvm/jre-1.6.0-openjdk/bin/java - 優先項目 16000
 スレーブ keytool: /usr/lib/jvm/jre-1.6.0-openjdk/bin/keytool
 スレーブ orbd: /usr/lib/jvm/jre-1.6.0-openjdk/bin/orbd
 スレーブ pack200: /usr/lib/jvm/jre-1.6.0-openjdk/bin/pack200
 スレーブ rmid: /usr/lib/jvm/jre-1.6.0-openjdk/bin/rmid
 スレーブ rmiregistry: /usr/lib/jvm/jre-1.6.0-openjdk/bin/rmiregistry
 スレーブ servertool: /usr/lib/jvm/jre-1.6.0-openjdk/bin/servertool
 スレーブ tnameserv: /usr/lib/jvm/jre-1.6.0-openjdk/bin/tnameserv
 スレーブ unpack200: /usr/lib/jvm/jre-1.6.0-openjdk/bin/unpack200
 スレーブ jre_exports: /usr/lib/jvm-exports/jre-1.6.0-openjdk
 スレーブ jre: /usr/lib/jvm/jre-1.6.0-openjdk
 スレーブ java.1.gz: /usr/share/man/man1/java-java-1.6.0-openjdk.1.gz
 スレーブ keytool.1.gz: /usr/share/man/man1/keytool-java-1.6.0-openjdk.1.gz
 スレーブ orbd.1.gz: /usr/share/man/man1/orbd-java-1.6.0-openjdk.1.gz
 スレーブ pack200.1.gz: /usr/share/man/man1/pack200-java-1.6.0-openjdk.1.gz
 スレーブ rmid.1.gz: /usr/share/man/man1/rmid-java-1.6.0-openjdk.1.gz
 スレーブ rmiregistry.1.gz: /usr/share/man/man1/rmiregistry-java-1.6.0-openjdk.1.gz
 スレーブ servertool.1.gz: /usr/share/man/man1/servertool-java-1.6.0-openjdk.1.gz
 スレーブ tnameserv.1.gz: /usr/share/man/man1/tnameserv-java-1.6.0-openjdk.1.gz
 スレーブ unpack200.1.gz: /usr/share/man/man1/unpack200-java-1.6.0-openjdk.1.gz
/usr/lib/jvm/jre-1.4.2-gcj/bin/java - 優先項目 1420
 スレーブ keytool: /usr/lib/jvm/jre-1.4.2-gcj/bin/keytool
 スレーブ orbd: (null)
 スレーブ pack200: (null)
 スレーブ rmid: (null)
 スレーブ rmiregistry: /usr/lib/jvm/jre-1.4.2-gcj/bin/rmiregistry
 スレーブ servertool: (null)
 スレーブ tnameserv: (null)
 スレーブ unpack200: (null)
 スレーブ jre_exports: /usr/lib/jvm-exports/jre-1.4.2-gcj
 スレーブ jre: /usr/lib/jvm/jre-1.4.2-gcj
 スレーブ java.1.gz: (null)
 スレーブ keytool.1.gz: (null)
 スレーブ orbd.1.gz: (null)
 スレーブ pack200.1.gz: (null)
 スレーブ rmid.1.gz: (null)
 スレーブ rmiregistry.1.gz: (null)
 スレーブ servertool.1.gz: (null)
 スレーブ tnameserv.1.gz: (null)
 スレーブ unpack200.1.gz: (null)
現在の「最適」バージョンは /usr/lib/jvm/jre-1.6.0-openjdk/bin/java です。

こんな感じだ。


デフォルトではこんな感じになっている。


[root@hdp01 ~]# alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
   2           /usr/lib/jvm/jre-1.4.2-gcj/bin/java


open java と Gnu Javaがインストールされていて、Open Javaが選択されている。
メッセージに従い、番号を選択すると切り替えが行われる。


自分で追加もできるけど結構面倒くさい。
OS標準で、添付されるパッケージについてはほとんどこういった切り替えが可能。




0 件のコメント:

コメントを投稿