rmid(1) Remote Method Invocation (RMI) rmid(1)

名前

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

概要

rmid [options]

options

コマンド行オプション。オプションを参照してください。

説明

rmidコマンドは、起動システム・デーモンを開始します。起動システム・デーモンを開始してからでないと、アクティブ化可能オブジェクトをアクティブ化システムに登録したり、JVM内でアクティブ化したりすることができません。アクティブ化可能なオブジェクトを使用するプログラムの作成方法の詳細は、アクティブ化の使用に関するチュートリアル(http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/activation/overview.html)を参照してください

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

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

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

rmidコマンドを実行すると、デフォルト・ポート1098でアクティベータと内部レジストリが起動され、ActivationSystemがこの内部レジストリ内の名前java.rmi.activation.ActivationSystemにバインドされます。

レジストリに他のポートを指定するには、rmidコマンドの実行時に-portオプションを指定する必要があります。たとえば、次のコマンドは、レジストリのデフォルト・ポート1099で、起動システム・デーモンとレジストリを起動します。

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

必要に応じてRMIDを開始

rmidをコマンド行から開始するには、inetd(Oracle 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の動作は、次のことを除いて、コマンド行から起動した場合と同じです。

System.errに対する出力は、ファイルにリダイレクトされる。このファイルはjava.io.tmpdirシステム・プロパティで指定されるディレクトリ(通常は/var/tmpまたは/tmp)にある。ファイル名の接頭辞はrmid-errで、接尾辞はtmpである。
-portオプションは使用できません。このオプションが指定されている場合、RMIDはエラー・メッセージが表示されて終了します。
-logオプションは必須。このオプションが指定されていない場合、RMIDはエラー・メッセージが表示されて終了します。

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

オプション

-Cオプション

rmidコマンドの子プロセス(起動グループ)が作成されたときに、それぞれの子プロセスにコマンド行引数として渡されるオプションを指定します。たとえば、次のように指定すると、起動システム・デーモンによって生成される各仮想マシンにプロパティを渡すことができます。
rmid -C-Dsome.property=value
コマンド行引数を子プロセスに渡す機能は、デバッグを行う場合に便利です。たとえば、次のコマンドでは、すべての子JVMでserver-callロギングが可能です。
rmid -C-Djava.rmi.server.logCalls=true

-Joption

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

-J-Dsun.rmi.activation.execPolicy=policy

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

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

rmidコマンドは、起動グループ用のJVMを起動するときに、そのグループについて登録された起動グループ記述子である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>>で構成されるパス名は、どのファイルとも一致します。

パス名にアスタリスク(*)を指定した場合は、現在のディレクトリ内のすべてのファイルを示します。パス名にマイナス符号(-)を指定した場合は、現在のディレクトリ内のすべてのファイルおよび(再帰的に)現在のディレクトリに含まれるすべてのファイルとサブディレクトリを示します。

ExecOptionPermission

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

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

例: *-Dmydir.*-Da.b.c=*は有効ですが、*mydir-Da*bab*は無効です。

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 propertyを使用することを許可しています。最後の権限は、起動グループがsun.rmi property名の階層内の任意のプロパティを使用することを許可しています。

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

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

•<policyClassName>

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

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

 public void checkExecCommand(ActivationGroupDesc desc, String[] command)
        throws SecurityException;
起動グループを開始する前に、rmidコマンドは、ポリシーのcheckExecCommandメソッドを呼び出します。このとき、起動グループの記述子と、起動グループを開始するための完全なコマンドを含む配列をそのメソッドに渡します。checkExecCommandSecurityExceptionをスローすると、rmidコマンドはその起動グループを開始せず、オブジェクトの起動を試行している呼出し側にはActivationExceptionがスローされます。
•none

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

-log dir

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

-port port

レジストリが使用するポートを指定します。起動システム・デーモンは、このレジストリの中で、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

関連項目

•java(1)
•クラス・パスの設定
2013年11月21日 JDK 8