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 rmidOptions
jreHomeはインストール済みJREへのパス、logDirはログ・ファイルのディレクトリ、rmidOptionsはその他のrmid用のオプション(プロパティの初期化など)です。rmidinetdによって起動される場合は、-logオプションを指定する必要があります。また、ポートは/etc/services構成ファイルから取得されるので、-portオプションは指定しないでください。

nobody以外のユーザーとしてrmidを実行する必要がある場合は、nobodyrmidを実行する必要のあるユーザーIDに置き換えてください。

/etc/servicesの構成

次に、rmid/etc/services構成ファイルにサービスとして指定する必要があります。この構成ファイルの形式の詳細については、Solaris OSのservices(4)のマニュアル・ページを参照してください。

サービスとしてrmidを指定するには、次のエントリを/etc/services構成ファイルに追加します(マシンへのルート・アクセス権が必要)。

rmid        port/tcp

portActivationSystemおよび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がinetdrmidを起動させます。

次は、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.GetActivationSystem
classDirは、この例のクラスのためのクラス・パスです。portは、/etc/servicesファイル内のrmidに構成された ActivationSystemのためのポートです。

プログラムがActivationSystemを正常に表示した場合は、inetdによってrmidが起動されたことになります。

プログラムがハング・アップするか例外のトレースを出力した場合は、rmidによって作成された出力ファイルをチェックしてください。rmidinetdによって起動されると、System.errへのすべての出力は、java.io.tmpdirプロパティで指定されたディレクトリ内のファイルに書き出されます。通常、Solaris OSでは、このディレクトリは/var/tmpです。この出力ファイルの接頭辞は「rmid-err」、接尾辞は「.tmp」です。このファイル名には、ファイル名を一意にするための文字(通常は数字)が接頭辞と接尾辞の間に含まれています。

rmidinetdから正しく起動された場合、出力ファイルには次のようなテキストが含まれています。警告もエラー・メッセージも含まれていません。

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プロセスを終了させることも忘れないでください。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.