rmid(1)

名前
rmid - Java RMI起動システム・デーモン

rmidでアクティブ化するシステム・デーモンを開始すると、オブジェクトを仮想マシン(VM)に登録してアクティブ化できるようになります。

形式

rmid [options]

説明

rmidツールは、起動システム・デーモンを開始します。アクティブ化システム・デーモンを開始してからでないと、アクティブ化可能オブジェクトをアクティブ化システムに登録したり、VM内でアクティブ化したりすることができません。起動可能なリモート・オブジェクトを使用したプログラムの作成方法の詳細は、 Java RMI仕様 @
http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmiTOC.htmlおよび 起動のチュートリアル @
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/activation/overview.htmlを参照してください。

デーモンを起動するには、次のように、セキュリティ・ポリシー・ファイルを指定してrmidコマンドを実行します。

    rmid -J-Djava.security.policy=rmid.policy

注意: rmidのSunの実装を実行する場合、デフォルトでは、セキュリティ・ポリシー・ファイルを指定する必要があります。それは、rmidが起動グループ用にVMを起動するために各ActivationGroupDesc内の情報を使用できるかどうかを検証できるようにするためです。特に、ActivationGroupDescのコンストラクタに渡されるCommandEnvironmentや任意のPropertiesによって指定されるコマンドおよびオプションは、rmidのセキュリティ・ポリシー・ファイルの中で明示的に許可することが必要になりました。sun.rmi.activation.execPolicyプロパティの値は、起動グループ用にVMを起動するためにActivationGroupDesc内の情報を使用できるかどうかを判断するときにrmidが使用するポリシーを決定します。

rmidをデフォルト設定で実行すると、次のような処理が行われます。

    o   アクティベータを起動し、デフォルト・ポート1098で内部レジストリを起動する

    o   この内部レジストリの中で、ActivationSystemをjava.rmi.activation.ActivationSystemという名前にバインドする

レジストリに他のポートを指定するには、rmidの起動時に-portオプションを指定する必要があります。次に示します。

    rmid -J-Djava.security.policy=rmid.policy -port 1099

このコマンドは、起動システム・デーモンを開始し、レジストリのデフォルト・ポート1099でレジストリを開始します。

  rmidをinetd/xinetdから開始する

rmidをコマンドラインから開始するには、inetd(Solarisの場合)、またはxinetd(Linuxの場合)を構成してrmidを必要に応じて開始する方法もあります。

rmidを開始すると、System.inheritedChannelメソッドを呼び出して、継承されたチャンネル(inetd/xinetdから継承)を取得しようとします。継承されたチャンネルがnullであるか、java.nio.channels.ServerSocketChannelのインスタンスでなかった場合、rmidはそのチャンネルはinetd/xinetdによって起動されたものではないと判断し、前述のように起動します。

継承されたチャンネルがServerSocketChannelインスタンスである場合は、rmidはエクスポートするリモート・オブジェクト、つまりjava.rmi.activation.ActivationSystemがバインドされているレジストリとjava.rmi.activation.Activatorリモート・オブジェクトに対するリクエストを受信するサーバー・ソケットとして、ServerSocketChannelから取得したjava.net.ServerSocketを使用します。このモードでは、rmidの動作は、次のことを除いて、コマンドラインから起動した場合と同じです。

    o   System.errに対する出力は、ファイルにリダイレクトされる。このファイルはjava.io.tmpdirシステム・プロパティで指定されるディレクトリ(通常は/var/tmpまたは/tmp)にある。ファイル名の接頭辞は"rmid-err"で、接尾辞は"tmp"である。

    o   -portオプションは拒否される。このオプションを指定すると、rmidはエラー・メッセージを出して終了する。

    o   -logオプションは必須。このオプションを指定しないと、rmidはエラー・メッセージを出して終了する。

必要に応じてサービスを開始するように構成する方法の詳細は、inetd(Solarisの場合)、またはxinetd(Linux)のマニュアル・ページを参照してください。

オプション

    -C<someCommandLineOption>
        rmidの子プロセス(起動グループ)が作成されたときに、それぞれの子プロセスにコマンドライン引数として渡されるオプションを指定します。たとえば、次のように指定すると、起動システム・デーモンによって生成される各仮想マシンにプロパティを渡すことができます。

            rmid -C-Dsome.property=value

        コマンドライン引数を子プロセスに渡す機能は、デバッグを行う場合に便利です。たとえば、次のようなコマンドを実行できます。

            rmid -C-Djava.rmi.server.logCalls=true

        このコマンドにより、すべての子VMでサーバー呼出しのログが作成されるようになります。

    -J<someCommandLineOption>
        rmidを実行しているjavaインタプリタに渡すオプションを指定します。たとえば、rmidがrmid.policyという名前のポリシー・ファイルを使用するように指定するには、rmidのコマンドラインで-Jオプションを使用して、java.security.policyプロパティを定義します。次に例を示します。

            rmid -J-Djava.security.policy=rmid.policy

    -J-Dsun.rmi.activation.execPolicy=<policy>
        起動グループが実行されることになるVMの起動に使用するコマンドおよびコマンドライン・オプションをチェックするために、rmidが採用するポリシーを指定します。このオプションは、Java RMI起動デーモンのSunの実装のみに存在することに注意してください。コマンドラインにこのプロパティを指定しない場合、結果は-J-Dsun.rmi.activation.execPolicy=defaultを指定した場合と同じになります。<policy>に指定可能な値は、default、<policyClassName>、またはnoneです。

        o   default(または、このプロパティが指定されていない場合)

        デフォルトのexecPolicyの場合、rmidが実行できるのは、rmidが使用するセキュリティ・ポリシー・ファイルの中で、実行する権限がrmidに与えられているコマンドおよびコマンドライン・オプションのみです。デフォルトの実行ポリシーで使用できるのは、デフォルトの起動グループ実装のみです。

        rmidは、起動グループ用のVMを起動するときに、そのグループについて登録された起動グループ記述子であるActivationGroupDesc内の情報を使用します。グループ記述子は、ActivationGroupDesc.CommandEnvironmentを指定します(省略可能)。これには、起動グループを開始するコマンドと、そのコマンドラインに追加できるコマンドライン・オプションが含まれています。デフォルトでは、rmidはjava.homeにあるjavaコマンドを使用します。グループ記述子には、オプションとしてコマンドラインに追加されるプロパティ・オーバーライドも含まれています。このプロパティは、次のように定義します。

            -D<property>=<value>

        アクセス権com.sun.rmi.rmid.ExecPermissionを使用すると、rmidに対して、グループ記述子のCommandEnvironmentで指定されたコマンドを実行して起動グループを開始する権限を許可することができます。アクセス権com.sun.rmi.rmid.ExecOptionPermissionを使用すると、グループ記述子でプロパティ・オーバーライドとして指定されたコマンドライン・オプション、またはCommandEnvironmentでオプションとして指定されたコマンドライン・オプションを、起動グループを開始するときにrmidが使用できるようになります。

        rmidに様々なコマンドおよびオプションを実行する権限を許可する場合は、アクセス権ExecPermissionおよびExecOptionPermissionを汎用的に許可する必要があります。つまり、すべてのコード・ソースに対して許可します。

            ExecPermission
                ExecPermissionクラスは、起動グループを開始するためにrmidが特定のコマンドを実行する権限を表します。

            構文
            ExecPermissionの名前は、rmidに実行を許可するコマンドのパス名です。「/*」(「/」はファイル区切り文字File.separatorChar)で終わるパス名は、そのディレクトリに含まれるすべてのファイルを示します。「/-」で終わるパス名は、そのディレクトリに含まれるすべてのファイルとサブディレクトリ(再帰的に)を示します。パス名に特別なトークン「<<ALL FILES>>」を指定した場合は、任意のファイルを示します。

            注意: 「*」を1つのみ指定したパス名は、現在のディレクトリ内のすべてのファイルを表します。また、「-」を1つのみ指定したパス名は、現在のディレクトリ内のすべてのファイルと、現在のディレクトリに含まれるすべてのファイルとサブディレクトリ(再帰的に)を表します。

            ExecOptionPermission
                ExecOptionPermissionクラスは、起動グループを開始するときにrmidで特定のコマンドライン・オプションを使用できる権限を表します。ExecOptionPermissionの名前は、コマンドライン・オプションの値です。

            構文
            オプションでは、ワイルドカードが限定的にサポートされます。アスタリスクは、ワイルドカード・マッチを表します。アスタリスクは、オプション名そのものとして使用できます。つまり、任意のオプションを表すことができます。また、オプション名の末尾に使用することもできます。ただし、「.」か「=」の直後にアスタリスクを指定する必要があります。

            例を示します。「*」、「-Dfoo.*」、「-Da.b.c=*」は有効ですが、「*foo」、「-Da*b」、「ab*」は無効です。

            rmidのポリシー・ファイル
                rmidに様々なコマンドおよびオプションを実行する権限を許可する場合は、アクセス権ExecPermissionおよびExecOptionPermissionを汎用的に許可する必要があります。つまり、すべてのコード・ソースに対して許可します。これらのアクセス権をチェックするのはrmidのみなので、これらのアクセス権を汎用的に許可しても安全です。

            rmidに各種の実行権限を許可するポリシー・ファイルの例を、次に示します。

            grant {
                permission com.sun.rmi.rmid.ExecPermission
                    "/files/apps/java/jdk1.7.0/solaris/bin/java";

                permission com.sun.rmi.rmid.ExecPermission
                    "/files/apps/rmidcmds/*";

                permission com.sun.rmi.rmid.ExecOptionPermission
                    "-Djava.security.policy=/files/policies/group.policy";

                permission com.sun.rmi.rmid.ExecOptionPermission
                    "-Djava.security.debug=*";

                permission com.sun.rmi.rmid.ExecOptionPermission
                    "-Dsun.rmi.*";
            };

            最初に付与されているアクセス権は、rmidに対し、パス名により明示的に指定されるjavaコマンドの1.7.0バージョンの実行を許可します。デフォルトでは、java.homeにあるバージョンのjavaコマンドを使用します。rmidが使用するのと同じバージョンが使用されるため、そのコマンドは、ポリシー・ファイルで指定する必要はありません。2番目のアクセス権は、rmidに対して、ディレクトリ/files/apps/rmidcmds内の任意のコマンドの実行権限を許可します。

            3番目に付与されているアクセス権ExecOptionPermissionは、rmidに対して、セキュリティ・ポリシー・ファイルを/files/policies/group.policyとして定義している起動グループの開始を許可します。次のアクセス権は、起動グループがjava.security.debugプロパティを使用することを許可しています。最後のアクセス権は、起動グループがsun.rmiというプロパティ名の階層内の任意のプロパティを使用することを許可しています。

            ポリシー・ファイルを指定してrmidを起動するには、rmidのコマンドラインでjava.security.policyプロパティを指定する必要があります。次に例を示します。

            rmid -J-Djava.security.policy=rmid.policy

        o   <policyClassName>

        デフォルトの動作では十分な柔軟性が得られない場合、管理者は、rmidの起動時に、checkExecCommandメソッドが所属するクラスの名前を指定して、rmidが実行するコマンドをチェックすることができます。

        policyClassNameには、引数なしのコンストラクタを持ち、次のようなcheckExecCommandメソッドを実装しているpublicクラスを指定します。

            public void checkExecCommand(ActivationGroupDesc desc,
                                         String[] command)
                throws SecurityException;

        アクティブ化グループを開始する前に、rmidは、ポリシーのcheckExecCommandメソッドを呼び出します。このとき、アクティブ化グループの記述子と、アクティブ化グループを開始するための完全なコマンドを含む配列をそのメソッドに渡します。checkExecCommandがSecurityExceptionをスローすると、rmidはそのアクティブ化グループを開始せず、オブジェクトのアクティブ化を試行している呼出し側にはActivationExceptionがスローされます。

        o   none

        sun.rmi.activation.execPolicyプロパティの値が「none」の場合、rmidは、起動グループを開始するコマンドをまったく検証しません。

    -log dir
        起動システム・デーモンがデータベースおよび関連情報を書き込むのに使用するディレクトリの名前を指定します。デフォルトでは、rmidコマンドを実行したディレクトリに、logというログ・ディレクトリが作成されます。

    -port port
        rmidのレジストリが使用するポートを指定します。起動システム・デーモンは、このレジストリの中で、java.rmi.activation.ActivationSystemという名前でActivationSystemをバインドします。したがって、ローカル・マシン上のActivationSystemは、次のようにNaming.lookupメソッドを呼び出すことによって取得できます。

            import java.rmi.*;
            import java.rmi.activation.*;

            ActivationSystem system; system = (ActivationSystem)
            Naming.lookup("//:port/java.rmi.activation.ActivationSystem");

    -stop
        -portオプションによって指定されたポートの、現在のrmid呼出しを停止します。ポートが指定されていない場合は、ポート1098で実行されているrmidを停止します。

環境変数

    CLASSPATH
        ユーザー定義クラスへのパスをシステムに指定します。ディレクトリはコロンで分割します。次に例を示します。

            .:/usr/local/java/classes

関連項目

rmic(1)、 CLASSPATH @
http://docs.oracle.com/javase/7/docs/technotes/tools/index.html#classpath、java(1)