inetd
を起動するrmid
の構成Solarisオペレーティング・システム(Solaris OS)では、インターネット・サービス・デーモンのinetd
が、システム・ブート時にサービスを起動する代替手段になります。インターネットの標準サービスに対するサーバー・プロセスであるこのデーモンを、必要に応じてサービスを起動するように構成することができます。インターネット・サービス・デーモンの詳細については、Solaris OSのinetd(1M)
のマニュアル・ページを参照してください。
必要に応じてJava RMI起動デーモンのrmid
を起動するようにinetd
を構成できます。この場合、rmid
をブート時に起動することも、手動で起動することも必要ありません。その代わり、オブジェクトを起動するなどのためにクライアントが接続しようとすると、rmid
が起動されます。
注: 再起動可能なサービスがrmid
に登録されている場合、rmid
は、inetd
によってではなく、システム起動時に起動されるようにすべきです。そのようにすると、再起動可能なサービスがシステム稼働中、常に実行されている状態になります。
rmid
を起動するようにinetd
を構成するには、inetd
が使用する/etc/inetd.conf
および/etc/services
の2つの構成ファイルのそれぞれにエントリを追加する必要があります。これらのファイルを編集するには、rmid
が実行されるマシンへのルート・アクセス権が必要です。
inetd
を再構成したあとで、正しく機能するかどうかを確認するために構成をテストする必要があります。
このチュートリアルでは、次の手順を実行します。
/etc/inetd.conf
の構成/etc/inetd.conf
構成ファイルには、inetd
がソケット経由で要求を受け取ったときに起動されるサービス用のエントリが含まれています。この構成ファイルの形式の詳細については、Solaris OSのinetd.conf(4)
のマニュアル・ページを参照してください。
rmid
を起動するようにinetd
を構成するには、次のエントリを/etc/inetd.conf
構成ファイルに追加します(マシンへのルート・アクセス権が必要)。
rmid stream tcp wait nobody jreHome/bin/rmid \ rmid -log logDir/rmid.log rmidOptionsjreHomeはインストール済みJREへのパス、logDirはログ・ファイルのディレクトリ、rmidOptionsはその他の
rmid
用のオプション(プロパティの初期化など)です。rmid
がinetd
によって起動される場合は、-log
オプションを指定する必要があります。また、ポートは/etc/services
構成ファイルから取得されるので、-port
オプションは指定しないでください。
nobody
以外のユーザーとしてrmid
を実行する必要がある場合は、nobody
をrmid
を実行する必要のあるユーザーIDに置き換えてください。
/etc/services
の構成次に、rmid
を/etc/services
構成ファイルにサービスとして指定する必要があります。この構成ファイルの形式の詳細については、Solaris OSのservices(4)
のマニュアル・ページを参照してください。
サービスとしてrmid
を指定するには、次のエントリを/etc/services
構成ファイルに追加します(マシンへのルート・アクセス権が必要)。
rmid port/tcp
portはActivationSystem
およびrmid
がエクスポートするActivator
リモート・オブジェクトのためのポート番号です。このポート番号は通常1098ですが、クライアントと起動可能なサービスがシステム・プロパティjava.rmi.activation.port
を別のポートに定義している場合は、別のポート番号を使うことができます。
inetd
による新しい構成の読込みここまでで構成ファイルが変更されたので、inetd
は新しい構成を読み取る必要があります。その結果、構成されたサービスに対応する適切なポートで待機できるようになります。
ただし最初に、rmid
がまだ実行されていないことを確認する必要があります。これを行うには、次のコマンドを実行します。
% ps -ef | grep rmid
上記コマンドにより実行中のrmid
プロセスについての情報が表示されない場合は、rmid
が実行されていないことになります。情報が表示された場合は、作業を続行する前に、まずrmid
をシャットダウンする必要があります。
次に、inetd
が新しい構成を読み取る必要があります。inetd
に構成を再度読み取らせるには、実行中のinetd
プロセスにハング・アップの信号を送信する必要があります。まず、次のコマンドを実行して、実行中のinetd
プロセスのプロセスIDを調べます。
% ps -ef | grep inetd
このコマンドによって、次のように表示されます。
root 171 1 0 Sep 30 ? 0:02 /usr/sbin/inetd -s
この例のinetd
のプロセスIDは、171
です。これで、次のコマンドにプロセスIDを指定して実行すると(ルート・アクセス権が必要)、inetd
プロセスにハング・アップ信号を送信することができます。
% kill -HUP 171
これで、プログラムが上記のように構成されたポートに接続しようとしたときにrmid
を起動するための設定が、inetd
に対してすべて行われます。
inetd
が正しく構成されたことをテストするには、ActivationSystem
を検索する単純なプログラムを実行することができます。次に、構成が正しい場合は、ActivationSystemがinetd
にrmid
を起動させます。
次は、java.rmi.activation.port
システム・プロパティの値として供給されたポート上でActivationSystem
を検索する単純なプログラムです。
package example.inetd; import java.rmi.activation.ActivationSystem; import java.rmi.activation.ActivationGroup; public class GetActivationSystem { public static void main(String[] args) throws Exception { ActivationSystem system = ActivationGroup.getSystem(); System.err.println("ActivationSystem = " + system); } }
次のようにして、このプログラムをコンパイルし、実行します。
% javac -d classDir GetActivationSystem.java % java -classpath classDir -Djava.rmi.activation.port=port example.inetd.GetActivationSystemclassDirは、この例のクラスのためのクラス・パスです。portは、
/etc/services
ファイル内のrmid
に構成された ActivationSystem
のためのポートです。
プログラムがActivationSystem
を正常に表示した場合は、inetd
によってrmid
が起動されたことになります。
プログラムがハング・アップするか例外のトレースを出力した場合は、rmid
によって作成された出力ファイルをチェックしてください。rmid
がinetd
によって起動されると、System.err
へのすべての出力は、java.io.tmpdir
プロパティで指定されたディレクトリ内のファイルに書き出されます。通常、Solaris OSでは、このディレクトリは/var/tmp
です。この出力ファイルの接頭辞は「rmid-err」、接尾辞は「.tmp」です。このファイル名には、ファイル名を一意にするための文字(通常は数字)が接頭辞と接尾辞の間に含まれています。
rmid
がinetd
から正しく起動された場合、出力ファイルには次のようなテキストが含まれています。警告もエラー・メッセージも含まれていません。
Tue Sep 30 13:07:38 EDT 2003 rmid startup with inherited channel: sun.nio.ch.ServerSocketChannelImpl[/192.0.2.120:1098]
ファイルが存在しないか、前述のテキストがファイル内にないか、または追加のエラー出力がファイル内にある場合は、構成を再チェックしてください。inetd
構成の変更を終えたときには、inetd
にハング・アップ信号を送信して変更済みの構成が読み込まれるようにしてください。また、その前に起動されたすべてのrmid
プロセスを終了させることも忘れないでください。