前へ | 次へ | 目次 | 索引 |
F$PID 関数とともに使用し,その選択基準を指定します。 F$CONTEXT 関数を使用すると,F$PID 関数は OpenVMS Cluster内の任意のノードからプロセス情報を取得できるようになります。
F$CONTEXT (コンテキスト・タイプ,コンテキスト・シンボル,選択項目,選択値,値修飾子)
コンテキスト・タイプ
コンテキスト・タイプを指定します。現在使用できるコンテキスト・タイプは PROCESS だけです。これは,F$PID に対する選択基準を決めるために使用します。同一 UIC のプロセスを見る場合は,特権は必要ありません。同一 UIC グループ内の別の UIC のプロセスを見る場合は, GROUP 特権が必要です。システム全体の UIC のプロセスを見る場合は, WORLD 特権が必要です。
コンテキスト・シンボル
F$CONTEXT で作成されたコンテキスト・メモリを参照するために, DCL が使用するシンボル名を指定します。 F$PID は,このコンテキスト・シンボルを使用して PID リストを処理します。シンボルを使用してコンテキスト・シンボルを指定してください。コマンド・プロシージャ内で最初に F$CONTEXT を使用するときには,未定義または空文字列が割り当てられたシンボルを指定してください。シンボルは "PROCESS_CONTEXT" タイプでローカル・シンボルをして作成されます。コンテキストが無効になった場合 (つまり F$PID ですべての PID を検索したか,または,その実行時にエラーが発生した場合) は,シンボルのタイプは "PROCESS_CONTEXT" ではなくなっています。コンテキストをキャンセルする場合は,コマンド・プロシージャ内で F$TYPE 関数を使用して検索できます。
選択基準を設定した後で F$PID を呼び出す場合は,このコンテキスト・シンボルを使用します。
選択項目
選択項目は,F$CONTEXT が使用する選択基準を指定するキーワードです。一度の呼出しに対して 1 つのキーワードしか指定できません。
注意
項目のリストを使用する場合は, NEQ 選択値を使用しないでください。これは,結果として得られる状態値は,つねに "真" だからです。次に例を示します。
$ EXAMPLE=f$context("PROCESS",CTX,"USERNAME","A*,B*","NEQ")
この式は,"ユーザ名が A* に等しくないまたは ユーザ名が B* に等しくない場合は,その規則に合致するユーザのプロセスを返します" と解釈されます。このオペランドは論理和であるので,状態値は常に "真" になります (たとえば ALFRED は B* に等しくないとか, BOB は A* に等しくないというように,どんなユーザ名でも A* あるいは B* に等しくない値となります)。
コンテキスト・タイプ PROCESS に対して使用できる選択項目キーワードを次の表に示します。
選択項目 選択値 値修飾子 説明 ACCOUNT 文字列 EQL, NEQ 有効なアカウント名 (またはそのリスト)。アスタリスク(*) およびパーセント記号(%)ワイルドカード文字を使用できる。 AUTHPRI 整数値 GEQ, GTR, LEQ, LSS, EQL, NEQ 許可されたベース優先度。Alpha では (0-63)。VAX では (0-31) をとる。 CANCEL 該当コンテキストに対する選択基準を取り消す。 CURPRIV キーワード ALL, ANY, EQL, NEQ 有効な特権名キーワード (またはそのリスト)。詳細は『OpenVMS Guide to System Security』参照。 GRP 整数 GEQ, GTR, LEQ, LSS, EQL, NEQ UIC グループ番号。 HW_MODEL 整数 EQL, NEQ 有効なハードウェア型番号 HW_NAME 文字列 EQL, NEQ 有効なハードウェア名またはキーワードのリスト。アスタリスク(*) およびパーセント記号(%)ワイルドカード文字を使用できる。 JOBPRCCNT 整数 GEQ, GTR, LEQ, LSS, EQL, NEQ ジョブのサブプロセス数 JOBTYPE キーワード EQL, NEQ 有効なジョブ・タイプ・キーワード
(DETACHED, NETWORK, BATCH, LOCAL, DIALUP, REMOTE)。詳細は『Compaq OpenVMS ユーザーズ・マニュアル』参照。MASTER_PID 文字列 EQL, NEQ 主プロセス ID MEM 整数 GEQ, GTR, LEQ, LSS, EQL, NEQ UIC メンバ番号 MODE キーワード EQL, NEQ プロセス・モード・キーワード
(OTHER, NETWORK, BATCH,および INTERACTIVE)。詳細は『Compaq OpenVMS ユーザーズ・マニュアル』参照NODE_CSID 整数 EQL, NEQ ノードのクラスタ ID 番号 NODENAME 文字列 EQL, NEQ ノード名(またはそのリスト)。アスタリスク(*) およびパーセント記号(%)ワイルドカードを使用できる。省略時の設定はユーザのローカル・ノード。すべてのノードを指定する場合は,値 "*" を使用する。 OWNER 文字列 EQL, NEQ 直親 PID PRCCNT 整数 GEQ, GTR, LEQ, LSS, EQL, NEQ プロセスのサブプロセス数 PRCNAM 文字列 EQL, NEQ プロセス名(またはそのリスト)。アスタリスク(*)およびパーセント記号(%)ワイルドカード文字を使用できる。 PRI 整数 GEQ, GTR, LEQ, LSS, EQL, NEQ プロセス優先度。Alpha では(0--63), VAX では(0--31)をとる。 PRIB 整数 GEQ, GTR, LEQ, LSS, EQL, NEQ ベース・プロセス優先度。Alpha では (0--63), VAX では (0--31)をとる。 STATE キーワード EQL, NEQ 有効なプロセス状態キーワード。詳細は,『OpenVMS System Services Reference Manual』の $GETJPI サービスに関する説明を参照。 STS キーワード EQL, NEQ 有効なプロセス状態キーワード。詳細は,『OpenVMS System Services Reference Manual』の $GETJPI サービスに関する説明を参照。 TERMINAL 文字列 EQL, NEQ 端末名(またはそのリスト)。アスタリスク(*) およびパーセント記号(%) ワイルドカード文字を使用できる。 UIC 文字列 EQL,NEQ ユーザ識別子(UIC)。 "[group,member]"の形式。 USERNAME 文字列 EQL, NEQ ユーザ名(またはそのリスト)。アスタリスク(*) およびパーセント記号(%) ワイルドカード文字を使用できる。
選択値
選択基準の値を指定します。たとえば次の例に示すように,ノード MYVAX 上の全プロセスを処理するには, "NODENAME" キーワードに対して "MYVAX" を指定します。
$ X = F$CONTEXT("PROCESS", ctx, "NODENAME", "MYVAX", "EQL")
いくつかの選択項目では,値をリストにすることもできます。この場合,各値はコンマ (.) で区切らなければなりません。たとえば,ノード名に MYVAX, HERVAX,および HISVAX を指定するには,次のように入力します。
$ X=F$CONTEXT("PROCESS",ctx,"NODENAME","MYVAX,HERVAX,HISVAX","EQL")
ファイルを指定する場合と同様に,いくつかの値に対して,ワイルドカード文字(* や %)を使用できます。
値修飾子
選択値に対する修飾子を指定します。選択値は修飾しなければなりません。たとえば,次に示すプロセス値のいずれか 1 つに基づいて選択するよう要求することにより,値を修飾できます。
- LSS --- F$PID への呼び出しで指定した値より小さい
- LEQ --- F$PID への呼び出しで指定した値より小さいかまたは等しい
- GTR --- F$PID への呼び出しで指定した値より大きい
- GEQ --- F$PID への呼び出しで指定した値より大きいかまたは等しい
- EQL --- F$PID への呼び出しで指定した値と等しい
- NEQ --- F$PID への呼び出しで指定した値と等しくない
リストの中には,キーワード ALL, ANY, EQL および NEQ で修飾されるものもあります。このようなリストは通常,複数の有効な特権から構成される,プロセス特権マスクのようなマスクです。各キーワードとその意味を次に示します。
- ALL --- リストのすべての項目がプロセスで真である。
- ANY --- リストの任意の項目がプロセスの属性の一部である。
- EQL --- 値が正確に一致する (つまり,指定されていない値は,プロセスで真であってはならない)。
- NEQ --- 値が一致しない。
複数の選択値を特定の選択修飾子と使用すると, (OR オペランドが指定されているかのように) 選択基準と一致するものを値とみなします。 (AND オペランドが指定されているかのように) 選択値は累積基準ではありません。
ALL は指定した値は存在しなければなりませんが,指定しない他の値も存在しても構いません。 EQL は指定した値は存在しなければなりませんが,指定しない他の値は存在してはなりません。これが,ALL と EQL の相違点です。たとえば,現在のプロセスが TMPMBX と OPER 特権を持っていて,他の特権を持っていても構わない場合は ALL を,他の特権を持っていてはならない場合は EQL をそれぞれ指定します。
F$CONTEXT 関数を使用して F$PID 関数の選択基準を設定します。F$CONTEXT 関数は,基準を作るときは何度でも呼び出せます。ただし,1 回の呼び出しにつき 1つの項目しか指定できません。項目値リストが適切な位置に与えられれば,複数のコンテキストを同時に操作することができます。
適切な呼出しで選択基準を設定したら,F$PID を繰り返し呼出して, F$CONTEXT 関数で指定した基準と合う全てのプロセス識別番号 (PID) を戻します。基準と合うプロセスが無くなると,空文字列が戻されます。
F$PID 関数が呼び出されると,コンテキスト・シンボルは "frozen" とみなされます。つまり,対応する選択基準が削除されるまで,同じコンテキスト・シンボルでは F$CONTEXT を再び呼び出すことができません。同じコンテキスト・シンボルに追加の選択基準を設定しようとすると,エラー・メッセージが表示されますが,コンテキストと選択基準には影響しないため F$PID 関数の呼出しは続けることができます。
F$CONTEXT は,プロセス・メモリを使用して選択基準を格納します。ある 2 つの状況では,このメモリが削除されます。 F$PID 関数を呼出して空文字 ("") が戻されたとき,つまり選択基準に合う全てのプロセスが戻された場合と,呼出しの際に CANCEL というキーワードをコンテキストとともに使用した場合です。このタイプの呼出しは Ctrl/Y 操作や他の条件処理ルーチンに適しています。
#1 |
---|
$!Establish an error and CTRL/Y handler $ ON ERROR THEN GOTO error $ ON CONTROL_Y THEN GOTO error $! $ ctx = "" $ temp = F$CONTEXT ("PROCESS", ctx, "NODENAME", "*","EQL") $ temp = F$CONTEXT ("PROCESS", ctx, "USERNAME", "M*,SYSTEM","EQL") $ temp = F$CONTEXT ("PROCESS", ctx, "CURPRIV", "SYSPRV,OPER", "ALL") $!Loop over all processes that meet the selection criteria. $!Print the PID and name of the image for each such process. $loop: $ pid = F$PID(ctx) $ IF pid .EQS. "" $ THEN $ GOTO endloop $ ELSE $ image = F$GETJPI(pid,"IMAGNAME") $ SHOW SYMBOL pid $ WRITE SYS$OUTPUT image $ GOTO loop $ ENDIF $!The loop over the processes has ended. $endloop: $ EXIT $! $!Error handler. Clean up the context's memory with the CANCEL $!selection item keyword. $! $error: $ IF F$TYPE(ctx) .eqs. "PROCESS_CONTEXT" THEN - temp = F$CONTEXT ("PROCESS", ctx, "CANCEL") $ EXIT |
この例では,選択基準を設置するために F$CONTEXT が 3 回呼び出されています。最初の呼び出しは,クラスタ内の全ノードを探索するよう指定しています。次の呼出しでは,ユーザ名が "M" で始まるか "SYSTEM" であるプロセスのみを対象とすることを指定しています。最後の呼出しでは,SYSPRV と OPER 特権の両方を持っているプロセスを選択することを指定しています。
ラベル "loop" と "endloop" で囲まれたコマンド行は, F$CONTEXT で設定した選択基準に合うプロセスを処理するため連続して F$PID を呼んでいます。各 PID を検索した後,そのプロセスが実行しているイメージ名を得るため F$GETJPI を呼び出しています。最後に,このプロシージャはイメージの名前を表示します。
エラーの場合,または CTRL/Y が押された場合は,制御は error に移され, (必要であれば)コンテキストがクローズされます。ここで,シンボル・タイプが PROCESS_CONTEXT であるか検査している点に注意してください。シンボル・タイプが PROCESS_CONTEXT であれば,選択基準は F$CONTEXT を使用して取り消さなければなりません。シンボル・タイプが PROCESS_CINTEXT ではない場合は,選択基準が設定されなかったか,または,F$PID 実行中にエラーが起きたかプロセス・リストが全て使用されたか,のいずれかです。
#2 |
---|
f$context("process",ctx,"prcnam ","symbiont*,mcote*","eql") f$context("process",ctx,"prcnam ","symbiont*,mcote* ","neq") f$context("process",ctx,"prcnam ","mcote* ","neq") f$context("process",ctx,"prcnam ","symbiont*","neq") |
この例では EQL と NEQ 選択値の違いを表す構文が 3 つ示してあります。最初の関数(EQLを指定)はプロセス名に symbiont と mcote を含むすべてのプロセスを戻します。 2番目と3番目の関数(NEQ を指定)は全てのプロセス (プロセス名に symbiont がない,または mcote がないプロセス) を戻すことに相当します。
OpenVMS Cluster システムから識別番号を戻し,システムのノード・リストの中で現在の位置を示すように,コンテキスト・シンボルを変更します。
F$CSID (コンテキスト・シンボル)
コンテキスト・シンボル
システムのノード・リストを示すポインタを格納するために, DCL が使用するシンボルを指定します。 F$CSID 関数は,このポインタを使用してクラスタ識別番号を戻します。シンボルを使用して コンテキスト・シンボル引数を指定します。最初に F$CSID を呼び出す時は,指定したシンボルは未定義または空文字列でなければなりません。
コンテキスト・シンボル引数が未定義または空文字列の場合, F$CSID 関数は,システムのノード・リストの最初のシステムの識別番号を返します。これ以降の呼出しでは,残りのクラスタ内のノードの識別番号がが順次返されます。
F$CSID 関数は,クラスタ識別番号を示す文字列を返し,システムのノード・リストで現在の位置を示すコンテキスト・シンボルを更新します。現在使用しているシステムがクラスタのメンバではない場合は,最初の戻り値は空文字です。
F$CSID 関数を使用すると,システム上のすべてのクラスタ識別番号を取り出せます。 F$GETSYI 関数を使用すると,特定のノードの情報を取り出せます。
最初の F$CSID 関数呼出しで,コンテキスト・シンボル引数が初期化され,後続の F$CSID 関数呼出しはクラスタ内の他のノードのクラスタ識別番号を戻します (クラスタ識別番号は,ランダムな順序で戻されます)。リスト内の最後のクラスタ識別番号を戻した後は,空文字列が戻されます。
#1 |
---|
$ IF F$GETSYI("CLUSTER_MEMBER") .EQS. "FALSE" THEN GOTO NOT_CLUSTER $ CONTEXT = "" $START: $ id = F$CSID (CONTEXT) $ IF id .EQS. "" THEN EXIT $ nodename = F$GETSYI ("NODENAME",,id) $ WRITE SYS$OUTPUT nodename $ GOTO start $NOT_CLUSTER: $ WRITE SYS$OUTPUT "Not a member of a cluster." $ EXIT |
このコマンド・プロシージャは, F$CSID 関数を使用してクラスタ内のシステム名を表示しています。代入式で,シンボル CONTEXT を宣言します。シンボル CONTEXT は, F$CSID 関数の コンテキスト・シンボル引数として使用します。 CONTEXT には空文字列が割り当てられているので,F$CSID 関数は,クラスタ・ノード・リストの最初のクラスタ識別番号を戻します。
F$CSID 関数が空文字列を返すのは,コマンド・プロシージャがリストの終わりであるか,またはクラスタではないノードでこの操作を行おうとしているか,のどちらかの場合です。 F$GETSYI 呼出しは,現在使用しているノードがクラスタのメンバか否かを確認します。コマンド・プロシージャは,この状態値で終了します。
F$CSID 関数が空文字列を返さなかった場合,このコマンド・プロシージャは F$GETSYI 関数の 3 番目の引数に識別番号を指定して,システム名を得ます。WRITE コマンドを使用すると,このシステム名が表示されます。
前へ | 次へ | 目次 | 索引 |