テクニカルノート045  


UNIX 環境において inetd から PERFORCEサーバを実行する

タスク

UNIX 環境において inetd から PERFORCEサーバを実行します

解決策

inetd とは?

inetd は起動スクリプトから実行する以外の p4d の起動方法であり、特殊なサービスを提供する際にも役立つことがあります。例えば、Perforce Software社には UNIX 環境で稼動するテストサーバがいくつかあり、それぞれが inetd サービスとして独自のポート番号で定義されています。

inetd を使用して p4d を起動する際には、注意点があります。
  • inetd は過剰な接続を拒否する場合があり、数千行の p4 コマンドを記述したスクリプトを実行すると、膨大な数の p4d が立ち上がることになり、inetd サービスが一時的に使用できなくなることがあります。
  • p4d は要求がある度に起動されるため、サーバをシャットダウンすることは簡単ではありません。サーバを停止するには、/etc/inetd.conf を変更して、inetd を再起動する必要があります。(p4 admin stop は何も表示することなく失敗します。)

inetd から起動する

次の行を /etc/inetd.conf に追加します。
	perforce stream tcp nowait username path/to/p4d p4d -i -r p4droot

そして、次の行を /etc/services に追加します。
	perforce nnnn/tcp

ただし、nnnn はこの PERFORCEサーバに割り当てるポート番号です。

上記の /etc/inetd.conf の行には、追加の "p4d" が必要であることに注意してください。inetd は argv[0] としてこれを渡します。それにより、最初の引数は -i オプションとなり、p4d はサーバとして起動される代わりに、標準入出力においてサーバに接続された単一のクライアントとして機能します。これは、inetd によって起動されるサービスでの慣例です。

xinetd から起動する

以下の行を /etc/services に追加します。
	perforce nnnn/tcp

ただし、 nnnn は xinetd が接続待ちのために使用するポート番号です。

次に、以下の内容を含む /etc/xinetd.d/perforce という新しいファイルを作成します。
	service perforce    
	{
		socket_type = stream
		wait        = no
		user        = user
		group       = group
		server      = path/to/executable
		server_args = arguments
		disable     = no
	}

最近の PERFORCEサーバの制限モード

p4d を inetd または xinetd から起動している場合、"p4 info" の出力結果に"restricted mode "に関する記述が表示されます。これは、所有しているライセンスのユーザ数にかかわらず、2人までしかユーザを作成できないことを意味します。新しいユーザを作成するには、サーバ・ルートに対して、一時的に標準デーモン・モードでサーバを起動する必要があります。

通常、PERFORCE サーバ p4d は、UNIX 環境でバックグラウンド・プロセスとして起動し、クライアントからの接続を待機します。しかし、inetd または xinetd および p4d -i を使用して p4d を起動させることができるのは、p4d への接続が確立したときです。

注意

/etc/inetd.conf 内の変更を有効するには、inetd を再起動しなければなりません。これを行うには、最初に ps コマンドと grep コマンドで inetd のプロセス ID (PID) を特定した後、適切な kill コマンドを使用するか、または一般的な pkill コマンドか pgrep コマンドを使用します。それらのコマンドが利用可能であるかを知るには、man pgrep を実行します。

	ps -auxww | grep inetd
	kill -HUP pid

または、単に次のコマンドを実行します。
	pkill -HUP inetd

ps の構文は、UNIX の種類によって異なることに注意してください。詳しくは、man ps のページを参照してください。

inetd 、とりわけ xinetd によって生成されたサーバは、標準入出力チャネルを使用してクライアントとの通信を行うため、トリガがその出力を標準エラー出力に送ることによって、クライアントとの接続が切断される場合があります。ご注意ください。

戻る