この節では構成ファイルとスクリプトについて説明します。
libnsl.so に定義されているライブラリルーチン doconfig() は、ファイル /etc/saf/pmtag/_sysconfig (システムごとの構成スクリプト)、/etc/saf/_sysconfig (ポートモニターごとの構成スクリプト)、/etc/saf/pmtag/svctag (サービスごとの構成スクリプト) に入っている構成スクリプトを解釈します。doconfig() の構文を次に示します。
# include <sac.h> int doconfig (int fd, char *script, long rflag);
script は構成スクリプト名です。
fd は、ストリーム操作オペレーションが適用されるストリームのファイル記述子です。
rflag は、script を解釈するモードを指定するビットマスクです。
rflag に指定できる値は、NORUN か NOASSIGN、またはこの 2 つの OR を取った値です。rflag がゼロの場合は、構成スクリプトのすべてのコマンドが解釈されます。rflag の NOASSIGN ビットがオンになっていると、assign コマンドは解釈できず doconfig() はエラーで終了します。rflag の NORUN ビットがオンになっていると、run と runwait のコマンドは解釈できず doconfig() はエラーで終了します。
スクリプトのどれかのコマンドでエラーが起こった場合、doconfig() はそこでスクリプトの解釈を終了し正の整数を返します。この値は、エラーが起こった行番号を表します。システムエラーが起こった場合は、-1 を返します。
スクリプトでエラーが起こった場合は、スクリプトが実行環境を設定していたプロセスは起動されません。
次の例では、サービスごとの構成スクリプトを解釈するのに doconfig() を使用しています。
. . . if ((i = doconfig (fd, svctag, 0)) != 0){ error ("doconfig failed online %d of script %s",i,svctag); }
システムごとの構成ファイル /etc/saf/_sysconfig は空の状態で配布されます。このファイルは、解釈される言語でコマンドスクリプトを記述することにより、システム上のすべてのサービスの環境をカスタマイズするために使用できます。この言語についてはこの章で説明するほか、doconfig(3NSL) マニュアルページにも説明があります。SAC は、起動されると doconfig() 関数を呼び出してシステムごとの構成スクリプトを翻訳します。SAC が起動されるのは、システムがマルチユーザーモードに入ったときです。
ポートモニターごとの構成ファイル (/etc/saf/pmtag/_config) はオプションの構成ファイルです。ユーザーはこのファイルを使用して、ポートモニターの環境と、ポートモニターが管理している特定のポートで提供されるサービスの環境とをカスタマイズできます。ポートモニターごとの構成スクリプトも、システムごとの構成スクリプトと同じ言語で書かれます。
ポートモニターごとの構成スクリプトは、ポートモニターが起動されたときに翻訳されて実行されます。ポートモニターが SAC に起動されるのは、SAC が起動されて自分自身の構成スクリプト (/etc/saf/_sysconfig) を実行した後です。
ポートモニターごとの構成スクリプトがあると、システムごとの構成スクリプトで提供されるデフォルトの構成スクリプトではなく、ポートモニターごとのスクリプトが実行されます。
ユーザーは、サービスごとの構成ファイルを使用して特定のサービスの環境をカスタマイズできます。たとえば、一般ユーザーには許されていない特殊な特権を必要とするサービスがあるとします。doconfig(3NSL) のマニュアルページに記述されている言語を使用すると、特定のポートモニターで提供される特定のサービスにこのような特殊な特権を与えたり奪ったりするスクリプトを書くことができます。
サービスごとの構成スクリプトを作成しておくと、上位レベルの構成スクリプトで提供されるデフォルトのスクリプトの代わりに、そのスクリプトが実行されます。たとえば、サービスごとの構成スクリプトで、デフォルトとは異なる STREAMS モジュールセットを指定することができます。
構成スクリプトを記述する言語は、一連のコマンドで構成されており、各コマンドはそれぞれ個別に翻訳されます。次の 5 つのキーワードが定義されています。assign、push、 pop、runwait、および run です。コメント文字は # です。空白行は無視されます。スクリプトの各行は 1024 文字を超えることはできません。
assign キーワードは環境変数の定義に使用します。
assign variable=value
variable は環境変数名で、value は環境変数に割り当てられる値です。value は文字列定数でなければなりません。パラメータ置換は使用できません。value は引用符で囲むことができます。 引用符で囲むときの規則は、シェルで環境変数を定義するときの規則と同じです。新たな環境変数を割り当てるための空間が足りない場合、指定構文に誤りがあるときは assign コマンドでエラーが起こります。
push キーワードは fd が指定するストリームへ STREAMS モジュールをプッシュするために使用します。 doconfig(3NSL) マニュアルページを参照してください。
push module1[, module2, module3, ...]
module1 は最初にプッシュされるモジュール名、module2 は 次にプッシュされるモジュール名です (module3 以降も同様)。指定したどれかのモジュールがプッシュできなかったとき、このコマンドはエラーとなります。その場合、同じ行で指定している残りのモジュールは無視され、既にプッシュされたモジュールはポップされます。
pop キーワードは指定したストリームから STREAMS モジュールをポップするために使用します。
pop [module]
引数なしで pop コマンドを実行すると、ストリームの一番上のモジュールがポップされます。引数を指定すると、モジュールは、指定したモジュールがストリームの一番上にくるまで、モジュールが 1 つずつポップされます。指定したモジュールがストリームにない場合は、ストリームはもとの状態のままで、コマンドはエラー終了します。モジュール名の代わりに特殊キーワード ALL を指定すると、ストリームから全モジュールがポップされます。ただし、一番上のドライバより上のモジュールだけが対象になることに注意してください。
runwait キーワードは、コマンドを実行してその終了を待ちます。
runwait command
command には、実行するコマンドのパス名を指定します。command は /bin/sh -c を付けて実行されます。シェルスクリプトもこのようにして構成スクリプトから実行できます。command が見つからないか、実行できなかったとき、または command は存在してもステータスが 0 以外のときは、runwait コマンドは実行エラーとなります。
run キーワードは、runwait と同じですが、command の終了を待たない点が異なります。
run command
command には、実行するコマンドのパス名を指定します。run コマンドがエラー終了するのは、command を実行する子プロセスを作成できなかったときだけです。
構文上は区別がつきませんが、run と runwait で実行されるコマンドのいくつかはインタプリタの組み込みコマンドです。インタプリタの組み込みコマンドが使用されるのは、プロセスのコンテキストの中でプロセスの状態を変える必要があるときです。doconfig() の組み込みコマンドは、シェルの特殊コマンドやこれらのコマンドと同様、実行のための別プロセスを生成しません。sh(1) のマニュアルページを参照してください。組み込みコマンドの初期セットを次に示します。
cd ulimit umask
この節では、SAC とポートモニターの管理コマンドを使用して、3 種類の構成スクリプトをインストールする方法を説明します。システムごとの構成スクリプトとポートモニターごとの構成スクリプトは sacadm コマンドで管理します。サービスごとの構成スクリプトは pmadm コマンドで管理します。
システムごとの構成スクリプトは sacadm コマンドで管理します。
sacadm -G [ -z script ]
システムごとの構成スクリプトを印刷するか置き換えるときは、-G オプションを使用します。-G オプションだけを指定すると、システムごとの構成スクリプトが印刷されます。-G オプションと -z オプションを組み合わせると、/etc/saf/_sysconfig が script に指定されたファイルの内容で置き換えられます。-G オプションは -z オプション以外のオプションと組み合わせて使用することはできません。
次に示すシステムごとの構成ファイル (_sysconfig) では、時間帯を示す変数 TZ を設定しています。
assign TZ=EST5EDT # set TZ runwait echo SAC is starting> /dev/console
モジュールごとの構成スクリプトは sacadm コマンドで管理します。
sacadm -g -p pmtag [ -z script ]
-g オプションは、ポートモニターごとの構成スクリプトの印刷、インストール、置き換えを行うときに使用します。-g オプションには -p オプションが必要です。-g オプションに -p オプションだけを組み合わせて指定すると、script に指定したファイルがポートモニター pmtag に対するポートモニターごとの構成スクリプトとしてインストールされます。-g オプションに -p オプションと -z オプションを組み合わせて指定すると、pmtag に指定したポートモニターのポートモニターごとの構成スクリプトと同じファイル script がインストールされます。あるいは、/etc/saf/pmtag/_config が存在する場合、script の内容に _config が置き換わります。-g オプションをこれ以外のオプションと組み合わせて使用することはできません。
_config ファイル内では、コマンド /usr/bin/daemon は STREAMS のマルチプレクサーを構築してまとめるデーモンプロセスを起動するとみなされます。この構成スクリプトをインストールすると、ポートモニターが必要とするコマンドを、ポートモニターの起動の直前に実行できます。
# build a STREAMS multiplexor run /usr/bin/daemon runwait echo $PMTAG is starting> /dev/console
サービスごとの構成スクリプトは、サービスが呼び出される前に、ポートモニターによって解釈されて実行されます。
pmadm -g -p pmtag -s svctag [ -z script ] pmadm -g -s svctag -t type -z script
SAC は自分自身の構成ファイル (_sysconfig) と、ポートモニターの構成ファイルの両方を解釈して実行します。サービスごとの構成ファイルだけは、ポートモニターが実行します。
-g オプションは、サービスごとの構成スクリプトの印刷、インストール、置き換えを行うときに使用します。-g オプションに -p オプションと -s オプションを組み合わせると、ポートモニター (pmtag) で提供されるサービス (svctag) のサービスごとの構成スクリプトが印刷されます。-g オプションに -p オプション、-s オプション、-z オプションを組み合わせると、指定したファイル (script) に入っているスクリプトが、ポートモニター (pmtag) で提供されるサービス (svctag) のサービスごとの構成スクリプトとしてインストールされます。-g オプションに -s オプション、-t オプション、-z オプションを組み合わせると、指定したファイル (script) が、ポートモニタータイプ (type) で提供されるサービス (svctag) のサービスごとの構成スクリプトとしてインストールされます。-g オプションを、上で述べた以外のオプションと組み合わせて使用することはできません。
次に示すサービスごとの構成スクリプトでは、2 つの設定を制御します。1 つは、プロセスの ulimit を 4096 に設定することにより、プロセスが作成するファイルサイズの上限を設定しています。もう 1 つは、umask を 077 に設定することにより、プロセスが作成するファイルに適用される保護マスクを指定しています。
runwait ulimit 4096 runwait umask 077