rmid
コマンドは、オブジェクトをJava仮想マシン(JVM)に登録して起動できるようにする、起動システム・デーモンを開始する場合に使用します。
説明
rmid
コマンドは、起動システム・デーモンを開始します。起動システム・デーモンを開始してからでないと、起動可能オブジェクトを起動システムに登録したり、JVM内で起動することができません。
次のように、rmid
コマンドを実行し、セキュリティ・ポリシー・ファイルを指定して、デーモンを開始します。
rmid -J-Djava.security.policy=rmid.policy
rmid
コマンドのOracleの実装を実行する場合、デフォルトでは、起動グループ用にJVMを開始する際に各ActivationGroupDesc
内の情報を使用できるかどうかをrmid
コマンドが検証できるように、セキュリティ・ポリシー・ファイルを指定する必要があります。特に、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の開始(Oracle SolarisおよびLinuxのみ)
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はエラー・メッセージを出して終了します。
rmidのオプション
-C option
rmid
コマンドの子プロセス(起動グループ)が作成されたときに、それぞれの子プロセスにコマンド行引数として渡されるオプションを指定します。たとえば、次のように指定すると、起動システム・デーモンによって生成される各仮想マシンにプロパティを渡すことができます。
rmid -C-Dsome.property=value
コマンド行引数を子プロセスに渡す機能は、デバッグを行う場合に便利です。たとえば、次のコマンドを使用すると、すべての子JVMでサーバー呼出しのロギングが可能になります。
rmid -C-Djava.rmi.server.logCalls=true
-J option
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
に指定可能な値は、default
、policyClassName
またはnone
です。
default
execPolicy
の値がdefault
または指定されていない場合、rmid
コマンドが使用するセキュリティ・ポリシー・ファイル内のコマンドおよびオプションを実行するためのアクセス権がrmid
コマンドに付与されているときにのみ、rmid
コマンドは特定のコマンド行オプションを付けてコマンドを実行できます。デフォルトの実行ポリシーで使用できるのは、デフォルトの起動グループ実装のみです。
rmid
コマンドは、起動グループの登録済起動グループ記述子であるActivationGroupDesc
内の情報を使用して、そのグループ用のJVMを起動します。グループ記述子は、起動グループを開始する際に実行するコマンドと、そのコマンド行に追加されるコマンド行オプションが含まれるオプションのActivationGroupDesc.CommandEnvironment
を指定します。デフォルトでは、rmid
コマンドは、java.home
にあるjava
コマンドを使用します。グループ記述子には、オプションとしてコマンド行に追加されるプロパティ・オーバーライド(-Dproperty=value
と定義)も含まれています。アクセス権com.sun.rmi.rmid.ExecPermission
は、rmid
コマンドに、グループ記述子のCommandEnvironment
で指定されたコマンドを実行して起動グループを開始するアクセス権を付与します。アクセス権com.sun.rmi.rmid.ExecOptionPermission
を使用すると、rmid
コマンドで、起動グループを開始するときにグループ記述子でプロパティ・オーバーライドとして指定され指定されたコマンド行オプションまたはCommandEnvironment
でオプションとして指定されたコマンド行オプションを使用できるようになります。rmid
コマンドに様々なコマンドおよびオプションを実行するアクセス権を付与する場合は、アクセス権ExecPermission
およびExecOptionPermission
をすべてのコード・ソースに付与する必要があります。
ExecPermission
クラス: rmid
コマンドが特定のコマンドを実行して起動グループを開始するためのアクセス権を表します。
ExecPermission
の構文: ExecPermission
の名前は、rmid
コマンドに実行するアクセス権を付与するためのコマンドのパス名です。
スラッシュ(/
)とアスタリスク(*
)で終わるパス名は、すべてのファイルがそのディレクトリに含まれることを示します(スラッシュはファイル・セパレータFile.separatorChar
です)。
スラッシュ(/
)とマイナス記号(-
)で終わるパス名は、(再帰的に)すべてのファイルとサブディレクトリがそのディレクトリに格納されていることを示します。
特別なトークン<<ALL FILES>>
で構成されるパス名は、任意のファイルと一致します。
アスタリスク(*
)で構成されるパス名は、現在のディレクトリ内にあるすべてのファイルを示します。
マイナス記号(-
)で構成されるパス名は、すべてのファイルが現在のディレクトリ内にあり、(再帰的に)すべてのファイルおよびサブディレクトリが現在のディレクトリに格納されていることを示します。
ExecOptionPermission
クラス: 起動グループを開始する際に、rmid
コマンドが特定のコマンド行オプションを使用するためのアクセス権を表します。ExecOptionPermission
の名前は、コマンド行オプションの値です。
ExecOptionPermission
の構文: オプションでは、ワイルドカードが限定的にサポートされます。アスタリスクは、ワイルドカードの一致を表し、オプション名自体として使用したり(任意のオプションと一致)、アスタリスク(*
)がドット(.
)または等号(=
)の後に続く場合にかぎってオプション名の末尾に使用できます。
たとえば、*
、-Dmydir.*
または-Da.b.c=*
は有効ですが、*mydir
、-Da*b
またはab*
は無効です。
rmidのポリシー・ファイル
rmid
コマンドに様々なコマンドおよびオプションを実行するためのアクセス権を付与する場合は、アクセス権ExecPermission
およびExecOptionPermission
を汎用的にすべてのコード・ソースに付与する必要があります。これらのアクセス権をチェックするのはrmid
コマンドだけなので、これらのアクセス権を汎用的に付与しても安全です。
rmid
コマンドに様々な実行アクセス権を付与するポリシー・ファイルの例を、次に示します。
Oracle Solaris:
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.*"; };
Windows:
grant { permission com.sun.rmi.rmid.ExecPermission "c:\\files\\apps\\java\\jdk1.7.0\\win\\bin\\java"; permission com.sun.rmi.rmid.ExecPermission "c:\\files\\apps\\rmidcmds\\*"; permission com.sun.rmi.rmid.ExecOptionPermission "-Djava.security.policy=c:\\files\\policies\\group.policy"; permission com.sun.rmi.rmid.ExecOptionPermission "-Djava.security.debug=*"; permission com.sun.rmi.rmid.ExecOptionPermission "-Dsun.rmi.*"; };
1番目に付与されているアクセス権を使用すると、rmid
コマンドは明示的なパス名で指定されたjava
コマンドの1.7.0リリースを実行できます。デフォルトでは、java.home
で見つかったバージョンのjava
コマンド(rmid
コマンドが使用するバージョンと同じ)が使用されるため、ポリシー・ファイルで指定する必要はありません。2番目のアクセス権を使用すると、rmid
コマンドは、ディレクトリ/files/apps/rmidcmds
(Oracle Solaris、LinuxおよびmacOS)またはディレクトリc:\files\apps\rmidcmds\
(Windows)のいずれかでコマンドを実行できます。
3番目に付与されているアクセス権ExecOptionPermission
を使用すると、rmid
コマンドは、セキュリティ・ポリシー・ファイルを/files/policies/group.policy
(Oracle Solaris)またはc:\files\policies\group.policy
(Windows)のいずれかとして定義している起動グループを開始できます。その次に付与されているアクセス権を使用すると、起動グループがjava.security.debug
プロパティを使用できます。最後のアクセス権を使用すると、起動グループがsun.rmi
というプロパティ名の階層内の任意のプロパティを使用できます。
ポリシー・ファイルを指定してrmid
コマンドを開始するには、rmid
のコマンド行でjava.security.policy
プロパティを指定する必要があります。次に例を示します。
rmid -J-Djava.security.policy=rmid.policy
policyClassName
デフォルトの動作では十分な柔軟性が得られない場合、管理者はrmid
コマンドの起動時に、checkExecCommand
メソッドが実行されるクラスの名前を指定してrmid
コマンドで実行されるコマンドをチェックできます。
policyClassName
には、引数のないpublicコンストラクタを持ち、次のようなcheckExecCommand
メソッドを実装しているpublicクラスを指定します。
public void checkExecCommand(ActivationGroupDesc desc, String[] command) throws SecurityException;
起動グループを開始する前に、rmid
コマンドは、ポリシーのcheckExecCommand
メソッドを呼び出し、そのメソッドに起動グループ記述子と、起動グループを開始するための完全なコマンドを含む配列を渡します。checkExecCommand
がSecurityException
をスローすると、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
の呼出しを停止します。