プロセスをバックグラウンドで実行します。
Synopsis
JOB:pc jobargument,...
J:pc jobargument,...
routine(routine-params):(process-params):timeout
routine(routine-params)[joblocation]:(process-params):timeout
routine(routine-params)|joblocation|:(process-params):timeout
routine[joblocation]:(process-params)
routine|joblocation|:(process-params)
JOB は、
ジョブ、
ジョブ起動プロセス、もしくは
バッチ・ジョブ と呼ばれる個別のプロセスを作成します。作成されたプロセスは、現在のプロセスと関係なく、バックグラウンドで実行されます。 通常は、ユーザ対話も行いません。ジョブ起動プロセスは、
JOB コマンドで明示的に指定されたものを除く、すべてのシステムの既定を継承します。
これに対し、
DO コマンドで呼び出されたルーチンは、現在のプロセスの一部としてフォアグラウンドで実行されます。
JOB は使用中のローカル・システムに、ローカル・プロセスを作成するか、他のシステムでリモート・プロセスの作成を実行することもできます。リモート・ジョブに関する詳細は、
リモート・ジョブの開始 を参照してください。
開始されるプロセス。以下の形式のいずれかで指定することができます。
コンマで区切られた値のリスト、式、または既存のローカル変数名。括弧は必須です。このリストは、
実パラメータ・リスト と呼ばれます。ルーチンには、
仮パラメータ・リスト が必須です。 また、このリスト内のパラメータ数は、実パラメータ・リスト内のパラメータ数以上でなければなりません。指定した実パラメータの方が多い場合、Caché は <PARAMPASS> エラーを返します。呼び出されるルーチンに仮パラメータ・リストが含まれている場合は、それを囲む括弧を指定する必要があります。 パラメータを渡さない場合も同様です。
ルーチン・パラメータは値によってのみ渡すことができます。 つまり、配列を渡すことはできないということです。この点で、値でも参照でもパラメータを渡すことができる
DO コマンドとは異なります。この制限から、
JOB コマンドでは配列を渡すことができません。 配列は、参照でしか渡すことができないからです。
ルーチンを開始するとき、Caché はすべての式を評価し、実リスト内の各パラメータの値をその位置に従って、対応する仮リストの変数にマップします。仮リスト内の変数が、実リスト内のパラメータよりも多い場合は、余った変数は未定義のままになります。
ルーチン・パラメータは、ローカル・プロセスによってのみ渡されます。リモート・ジョブを作成しているときは、ルーチン・パラメータを指定することはできません。詳細は、
リモート・ジョブの開始 を参照してください。
コロンで区切られた定位置パラメータのリスト。 ジョブの環境内のさまざまな要素を設定するために使用されます。先頭のコロンと括弧は必須です。
processparams には、最大 4 つの定位置パラメータを指定できます。その 4 つのパラメータは以下の通りです。
これらのパラメータの位置は決められているので、必ず示した順に指定してください。指定するパラメータの前に省略するパラメータがある場合は、プレースホルダとしてコロンを付ける必要があります。
ジョブがタイムアウトし、中止される前に、ジョブ起動プロセスの開始を待機する秒数。最初のコロンは必須です。
timeout は、整数値または式を指定する必要があります。ジョブ化したプロセスがタイムアウトになると、Caché はプロセスを中止し、
$TEST を偽 (0) に設定します。実行は、呼び出しルーチンの次のコマンドから続行します。 エラー・メッセージは発行されません。
タイムアウトは、ローカル・プロセスに対してのみ指定されます。
以下の例は、監視ルーチンをバックグラウンドで開始します。プロセスが 20 秒以内に開始されない場合、Caché は
$TEST を偽 (0) に設定します。
JOB ^monitor::20
WRITE $TEST
以下の例は、Disp という名前の行ラベルで、監視ルーチンの実行を開始します。
以下の例は、ADD ルーチンを開始します。このとき、変数
num1 内の値、値 8、および式 a + 2 の結果の値がルーチンに渡されます。ADD ルーチンには、少なくとも 3 つのパラメータを含む、仮パラメータ・リストが含まれます。
以下の例は、ADD ルーチンを開始します。 このルーチンは仮パラメータ・リストを持っていますが、パラメータは渡されません。この場合、ADD ルーチンは、呼び出し元のルーチンから値を受け取らないので、その仮パラメータに既定値を割り当てるコードが含まれていなければなりません。
以下の例は、ラベル AA の現在のルーチンで実行するプロセスを作成します。プロセス・パラメータは、現在のシンボル・テーブルをルーチンに渡します。OpenVMS や UNIX で実行している場合、JOB サーバを使用します。
以下の OpenVMS コマンドは、暗黙のネームスペース [USER.TEST] ディレクトリで
^REPORT ルーチンを実行するプロセスを作成します。暗黙のネームスペースは、
"^^dir" のように 2 つのキャレット文字が先頭にくるディレクトリ・パスあるいは OpenVMS ファイル仕様です。
^REPORT は基本デバイスからの入力を必要としないので、基本デバイスとして NULL デバイスが指定されています。report.L ファイルは、基本出力デバイスです。
JOB ^REPORT:("^^[USER.TEST]"::"NL:":"report.L")
以下のコマンドは、ルーチン・パラメータ VAL1、および文字列 "DR." を現在のネームスペースの、エントリ・ポイント ABC で開始される、
^PROG ルーチンに渡します。このルーチンは 2 つの引数を要求します。Caché は現在のシンボル・テーブルをこのジョブに渡しません。 また、使用できる場合は JOB サーバを使用し、主入出力として tta5: を使用します。
JOB ABC^PROG(VAL1,"DR."):(:0:"tta5:")
Caché が割り当てるジョブ番号とメモリ・パーティション
ジョブ起動プロセスの開始後、Caché は、そのプロセスに個別のメモリ・パーティションと、一意のジョブ番号 (またはプロセス ID、PID とも言われます) を割り当てます。ジョブ番号は、特殊変数
$JOB に保存されます。ジョブの状態 (そのジョブが
JOB コマンドで開始されたか否かも含む) は、
$ZJOB 特殊変数に格納されます。
ジョブ起動プロセスは、それぞれ別個のメモリ・パーティションを保持しているので、そのプロセスを作成したプロセスやジョブ起動プロセス相互で、共通のローカル変数環境を共用することはありません。ジョブ起動プロセスを開始するときには、パラメータ渡し (
routineparams) により、現在のプロセスからジョブ起動プロセスに値を渡すことができます。
JOB コマンドが失敗する一般的な原因は以下の通りです。
値渡しのパラメータは、1 方向のみで発生し、それはジョブの起動時のみです。プロセス相互の通信を行うには、双方が合意したグローバル変数を使用する必要があります。このような変数は、プロセス間の情報交換を可能にすることだけが目的なので、一般に
スクラッチ・グローバル と呼ばれます。
Note:
特殊なプロセス・パラメータを指定することによって、現在のプロセスのすべてのローカル変数を、呼び出されたプロセスに渡すことができます。
プロセスは、IPC (プロセス間通信) デバイス (デバイス番号 224 ~ 255) を介して通信することもできます。 また、UNIX オペレーティング・システムでは、UNIX パイプを介した通信も可能です。
Caché は、呼び出されるルーチンが新しいプロセスのデバイス所有権を扱うコード (
OPEN コマンドや
USE コマンド) を含むと仮定しています。既定のデバイスは、NULL デバイスです。
Caché は、サインイン時に開始されたプロセス以外のプロセスには、既定のデバイスを割り当てません。
%PRIO ユーティリティを使用すると、ジョブ起動プロセスの実行優先度を制御できます。例えば、優先度が HIGH の場合、ジョブ起動プロセスは、対話型プロセスと対等に CPU リソースを争います。
Caché で、ジョブ起動プロセスに対して既定の優先度を設定することもできます。
Raw パーティションで JOB コマンドを使用する (UNIX)
以下のいずれかの方法で、
JOB コマンドを Raw パーティションで使用できます。
-
Raw パーティションで
JOB コマンドを実行する
-
Raw パーティションで実行しているコマンドとジョブ起動プロセスは、ファイル名を参照するときは常に、フル・パス名を指定する必要があります。 また、"." や ".." で開始するパス名は使用してはなりません。これらは特殊な UNIX ファイルであり、Raw パーティションには存在しないからです。これらのルールのいずれかに違反すると、<DIRECTORY> エラーが発生します。
現在のネームスペースの名前を取得するには、以下のコマンドを実行します。
また、Caché ObjectScript の
JOB コマンドの代わりに、UNIX のバッチ・コマンド
& を使用することもできます。例えば、test という名前のルーチンを Raw ディスク・パーティションでバッチ・ジョブとして開始するには、以下のように入力して、Caché を呼び出します。
DSM-DDP での リモート JOB 要求の取得
DSM-DDP ネットワークの場合、Caché はリモート DSM システムから
JOB 要求を取得することができます。JOB 要求には、特定のシステムの特定のネームスペースで開始する、ルーチンの名前が含まれています。 形式は以下の通りです。
ネットワーク・ジョブ要求では、パラメータ渡しはサポートされていません。
この機能を使用すると、既存のサーバ・アプリケーションを DSM から Caché に移動することができます。アプリケーションのクライアント部分は、DSM ホストを変更しなくても動作します。
以下の構文を使用すると、ある Caché システムから別の Caché システムへ、リモート・ジョブを送信できます。
JOB routine[joblocation]:(process-params)
JOB routine|joblocation|:(process-params)
2 つの形式は類似しています。
joblocation パラメータを囲むのは、角括弧 ([ ])、または垂直バー ( | ) のどちらでも使用できます。リモート・ジョブは、ルーチン・パラメータを渡すことができません。また、リモート・ジョブはタイムアウトの指定もできません。
プロセス・パラメータはオプションです。しかし、リモート・ジョブは最初のプロセス・パラメータ (
nspace) を指定することはできません。これが
joblocation パラメータと競合するからです。したがって、2 番目、3 番目、および 4 番目のプロセス・パラメータのみが指定され、指定されない
nspace パラメータはコロンで示される必要があります。
ジョブの場所を指定する構文の形式によって、Caché の動作が異なります。
リモート・ジョブでのグローバル・マッピング (Windows)
Caché ではリモート・ジョブに対してグローバル・マッピングを行うことはできません。 要求を行っているシステムで、グローバル・マッピングが定義されているかどうかは問題ではありません。グローバル・マッピングが使用できないところでは、そのネームスペースにないグローバルの場所を指すグローバル指定ができる拡張参照を使用してください。拡張参照で指定したネームスペースが、指定したシステムで定義されていない場合、<NAMESPACE> が返されます。ネームスペースと拡張グローバル参照に関する詳細は、
Caché 多次元ストレージの使用法 の
グローバル参照 を参照してください。
要求しているシステムでは、ジョブ開始がターゲット・システムで正常に実行されたかを示す、直接のメッセージを受信しません。しかし、Caché では、ジョブ開始の成功、または失敗を示すメッセージが、ターゲット・システムのコンソール・ログに書き込まれます。
リモート・ジョブ要求を受信する予定のシステムには、あらかじめその機能を設定しておく必要があります。
[Caché 構成マネージャ] の、[詳細] タブの [ネットワーク] オプションで、
[リモート・ジョブ] を [はい] に設定してください。Caché 構成マネージャの使用に関する詳細は、オンライン・ヘルプ、または "
Caché システム管理" の "
Caché の構成" を参照してください。
リモート・システムのライセンスでは、リモートで開始されるジョブを実行できる十分なユーザがサポートされている必要があります。
特殊変数 $ZCHILD と $ZPARENT の使用
$ZCHILD には、
JOB コマンドによって最後に作成されたプロセスの PID が含まれています。 このプロセスは成功したものでなくてもかまいません。
JOB サーバは、JOB 要求の処理を待つ Caché プロセスです。JOB サーバに添付されているジョブ起動プロセスは、新しいプロセスを作成する必要があるというオーバーヘッドの付加を回避します。JOB サーバが利用できる場合、それを使用するように設定する switch パラメータを指定した
JOB コマンドをユーザが実行するときは常に、Caché は、その処理を行うのに利用できる JOB サーバがあるかを確認します。JOB サーバがない場合は、Caché がプロセスを作成します。使用できる JOB サーバがある場合、JOB はその JOB サーバに添付されます。
JOB サーバで実行されている JOB で HALT が実行された場合、JOB サーバは他の JOB 要求を受け取るまで、ハイバネーション状態になります。JOB サーバで動作していないジョブ起動プロセスは終了し、そのプロセスは削除されます。
JOB サーバ環境と、ジョブ起動プロセス環境では避けられない違いがいくつかあります。 これらは、ジョブ起動プロセスを JOB サーバで実行する場合に、セキュリティ上の問題になる可能性があります。ジョブ起動プロセスは通常、Caché および OpenVMS レベルの両方で、
JOB コマンドを実行したプロセスの UIC をとります。
しかし、JOB サーバで動作しているジョブ起動プロセスは、OpenVMS レベルで JOB サーバ の UIC を使用します。JOB サーバの UIC は、Caché システム・マネージャの UIC と同じで、通常は [1,4] です。これは、JOB サーバが OpenVMS RMS ファイルやデバイスにアクセスするときに、OpenVMS によって最大限のアクセスが許可されることを意味します。Caché をアプリケーション環境で実行した場合は問題はありませんが、Caché をプログラマ・モードで使用した場合は、これが問題になります。
一度に 1 つのプロセスだけが、デバイスを所有できます。OpenVMS では、基本入力デバイス、または出力デバイスをクローズすることはできません。これは、ユーザがデバイス 0 をクローズする場合でも、JOB サーバで実行中のジョブが、基本入出力デバイスに対して入力、または出力を実行できないことを意味します。
したがって、JOB サーバに入力を実行させたい場合は、以下を指定します。
-
-
出力デバイス用の NULL デバイス (出力を表示させたくない場合)
このガイドラインに従っていない場合、JOB サーバで実行中のジョブは、基本入出力デバイスに対して、入力や出力を行わなければならなくなったときに、停止します。JOB の出力が頻繁に端末に表示される場合もありますが (SHARE 特権を持っている場合など)、通常は表示されません。
実行されないジョブに関するトラブル・シューティング
ジョブが開始しない場合は、入出力仕様をチェックしてください。Caché が要求されたデバイスをオープンすることができない場合、ジョブは開始されません。NULL デバイス (OpenVMS では NL:、UNIX では /dev/null) は常に利用できることに注意してください。
ジョブが開始されてもすぐに停止される場合は、適切なスワップ領域があることを確認してください。十分なスワップ領域がない場合、ジョブはエラーを受信します。
ジョブが開始されない場合は、
JOB コマンドで正しいネームスペースを使用していることを確認してください。ネームスペースが
$ZUTIL(90,10) を使用して定義されたか否かをテストすることができます。
JOB コマンドが目的通りに実行されない場合は、以下を試してください。
-
-
(
OpenVMS)ジョブ起動プロセスはすべて、システム・ログ・ファイル SYS$MANAGER:SYLOGIN.COM を実行します。ファイルに、ジョブ起動プロセスが停止するような文が含まれていないことを確認してください。
-
OpenVMS: JOB サーバで動作しないジョブ起動プロセスは、ユーザの LOGIN.COM ファイルも実行します。このファイルも同様に確認してください。
-
OpenVMS または Caché で許諾されているプロセス数を、超えていないことを確認してください。
-
JOB コマンドに timeout パラメータがある場合は、システムの速度が原因で、指定されたタイムアウト時間を超過しているのかどうかを確認してください。
ジョブ起動プロセスは、終了する前にそれを作成したプロセスがログオフされた場合でも、最後まで続けられます。
JOB コマンドを使用して、
TCP 並行サーバ を実装することができます。TCP 並行サーバを使用すると、複数のクライアントを同時に処理できます。このモードでは、クライアントは、サーバが他のクライアントのサービスを終了するまで待機する必要はありません。代わりに、クライアントがサーバに要求を送信するたびに、必要に応じてオープンしているクライアントに個別のサブジョブを生成します。このサブジョブが生成された直後に (
JOB コマンドから制御が戻ります)、他のクライアントが処理を要求することがあります。 サーバは、そのクライアントのサブジョブも同様に生成します。
非並行モードおよび並行モードのクライアント/サーバ接続
並行ビットが設定されている場合、
JOB コマンドが、ジョブ起動プロセスに TCP ソケットを渡すことが重要です。追加の機能ごとに適切なビット・コードに 4 を追加すると、
JOB コマンドの他の機能と組み合わせることができます。例えば、
switch が値 1 のビットを含むときは、シンボル・テーブルが渡されます。並行モードをオンにし、シンボル・テーブルを渡すには、
switch の値を 5 にします。
JOB コマンドの後、生成されているプロセスのデバイスは、継続して TCP ポートで要求を待ち受けていますが、既にアクティブな接続はありません。アプリケーションは、
JOB コマンドの実行後
$ZA 特殊変数を確認し、TCP デバイスで CONNECTED ビットがリセットされていることを確認する必要があります。
生成されたプロセスは、指定の TCP デバイスを
principalinput デバイスおよび
principaloutput デバイスの両方に使用し、指定のエントリ・ポイントで開始します。子プロセスの TCP デバイス名は、親プロセスの名前と同じです。TCP デバイスには、付属のソケットが 1 つあります。継承された TCP デバイスは、S (ストリーム) モードです。しかし、子プロセスは、
USE コマンドでモードを変更できます。サーバは、TCP デバイスを A (受信) モードでオープンすることをお勧めします。
生成されたプロセスの TCP デバイスは、接続された状態です。これは、デバイスがクライアントからオープンされた後と同じ状態です。生成されたプロセスは、TCP デバイスを
USE 0 あるいは
USE $PRINCIPAL で使用します。また、TCP デバイスを暗黙的に使用することもできます (以下の例で説明します)。
以下の例は、非常に単純な並行サーバです。 このサーバは、クライアントからの接続を検出するたびに子ジョブを生成します。
server ;
SET io="|TCP|1"
SET ^serverport=7001
OPEN io:(:^serverport:"MA"):200
IF $TEST=0 {
WRITE !,"Cannot open server port"
QUIT }
ELSE { WRITE !,"Server port opened" }
loop USE io READ x ; Read for accept
USE 0 WRITE !,"Accepted connection"
JOB child:(:5:io:io) ;Concurrent server bit is on
GOTO loop
child ;
WRITE $JOB,! ;Send job id on TCP device to be read by client
QUIT
client ;
SET io="|TCP|2"
SET host="127.0.0.1"
OPEN io:(host:^serverport:"M"):200 ;Connect to server
IF $TEST=0 {
WRITE !,"Cannot open connection"
QUIT }
ELSE { WRITE !,"Client connection opened" }
USE io READ x#3:200 ;Reads from subjob
ELSE WRITE !,"No message from child" CLOSE io QUIT
USE 0 WRITE !,"Child is on job ",XECUTE
CLOSE io
QUIT
子ジョブは、継承した TCP 接続を使用して、ジョブ ID (この場合は 3 文字とします) をクライアントに渡します。 その後、子プロセスは終了します。クライアントは、サーバとの接続をオープンし、その状態で子のジョブ ID を読み取ります。この例では、変数 "host" の値 "127.0.0.1" がローカル・ホスト・マシンへのループバック接続を示しています。host にそのサーバの IP アドレス、または名前が設定される場合は、そのサーバからクライアントを別のマシンにセットアップすることもできます。
原則的には、子プロセスとクライアントはさらに通信が可能で、複数のクライアントが並行して、対応するサーバの子と通信できます。
Caché は、ジョブ起動子プロセスのパーティション・サイズの指定をサポートします。既定では、ジョブ起動プロセスのパーティション・サイズは、
JOB を実行するときには、システム全体の既定のパーティション・サイズと同じになっています。
JOB を実行した親プロセスのパーティション・サイズは関係ありません。システム・ワイドなパーティション・サイズは、最大の 16 MB に動的に増大します。
ジョブ起動プロセスのパーティション・サイズ (キロバイト単位) は、
JOB コマンドの第 2 プロセス・パラメータで指定できるようになっています。使用する値は、32 の倍数で、範囲は、128 ~ 16384 です。
オプションで、パーティション・サイズのプロセス・パラメータの値を、通常
JOB の第 2 プロセス・パラメータに入れる、他のプロセス情報と組み合わせて指定することもできます。以下の
JOB コマンドを考えてみましょう。
このコマンドは、ジョブを実行しているプロセスのシンボル・テーブルをジョブ起動プロセスに渡すこと、また、ジョブ起動プロセスのパーティション・サイズを 544 K にすることを指定しています。この第 2 パラメータで、2 つの値 (544 と 1) を 545 として渡すように指定することもできますが、544+1 とした方がわかりやすく、まったく同じ効果もあります。