Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

HALT

現在のプロセスの実行を終了します。

Synopsis

HALT:pc
H:pc

引数

pc オプション — 後置条件式

概要

HALT コマンドは、現在のプロセスの実行を終了します。$HALT 特殊変数が現在のコンテキスト内 (または前のコンテキスト内) に定義されている場合、 HALT コマンドを発行すると、現在のプロセスが終了されるのではなく、$HALT で指定されている停止トラップ・ルーチンが呼び出されます。通常、停止トラップ・ルーチンは削除処理またはレポート処理を実行してから、2 番目の HALT コマンドを発行して実行を終了します。

HALT の振る舞いは、ルーチン・コードの実行により検出される場合も、プログラマ・モード・プロンプトから入力される場合も同じです。どちらの場合も、現在のプロセスを終了します。

HALT の最小省略形は HANG コマンドと同じですが、HANG は、必須の引数 hangtime を取るため区別できます。

HALT の効果

HALT が処理を終了すると、システムは自動的にこのプロセスのすべてのロックを解除し、このプロセスが所有していたデバイスをすべて閉じます。これにより、終了したプロセスがロックされた変数や未解放のデバイスを残さないようにします。

HALT がプロセスを終了するときに進行中のトランザクションがある場合、トランザクションの解決はプロセス・タイプによって異なります。バックグラウンド・ジョブ (非インタラクティブ・プロセス) 中の HALT は、進行中のトランザクションを必ずロール・バックします。インタラクティブ・プロセス (ルーチンを実行するためにターミナルを使用するなど) 中の HALT は、進行中のトランザクションの解決を求めるプロンプトを表示します。このプロンプトは、以下のとおりです。

You have an open transaction.
Do you want to perform a (C)ommit or (R)ollback? R =>

現在のトランザクションをコミットするには、“C ”を指定します。現在のトランザクションをロール・バックするには、“R” を指定します (または単に Enter キーを押します)。

停止トラップ

HALT コマンドの実行は、停止トラップによって割り込まれます。停止トラップは、HALT 特殊変数を使用して作成します。

停止トラップが現在のコンテキスト内に作成されている場合、HALT コマンドにより、$HALT で指定される停止トラップを実行します。HALT コマンド自身は実行されません。

停止トラップが低いレベルのコンテキスト・フレームにある場合、HALT コマンドは停止トラップを持つコンテキスト・フレームに到達するまで、フレーム・スタックからコンテキスト・フレームを削除します。その後、HALT$HALT で指定される停止トラップ・ルーチンを呼び出し、実行を中止します。

引数

pc

コマンドを条件付きにする、オプションの後置条件式。Caché は、後置条件式が True (0 以外の数値に評価される) の場合に HALT コマンドを実行します。Caché は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

以下の例では、HALT によって、ユーザは現在のアプリケーションを終了し、オペレーティング・システムに戻ることができます。システムでは、ユーザが必要とするクリーンアップがすべて実行されます。コマンドは後置条件式を使用していることに注意してください。

Main
  READ !,"Do you really want to stop (Y or N)? ",ans QUIT:ans=""
  HALT:(ans["Y")!(ans="y")
  DO Start
Start()
  WRITE !,"This is the Start routine"
  QUIT

以下の例では、HALT$HALT で指定されている停止トラップ・ルーチンを呼び出します。この場合、実際に実行を停止するのは、2 番目の HALT コマンドです(デモンストレーションのために、この例では、表示された出力を参照する時間を取れるように HANG 文を使用します)。

Main
   NEW $ESTACK
   SET $HALT="OnHalt"
   WRITE !,"Main $ESTACK= ",$ESTACK   // 0
   HANG 2
   DO SubA
   WRITE !,"this should never display"
SubA()
   WRITE !,"SubA $ESTACK= ",$ESTACK   // 1
   HANG 2
   HALT    // invoke the OnHalt routine
   WRITE !,"this should never display"
OnHalt()
   WRITE !,"OnHalt $ESTACK= ",$ESTACK   // 0
   HANG 2
   // clean-up and reporting operations
   HALT   // actually halt the current process

$SYSTEM.Process.Terminate()

現在のプロセスを停止するか、または他の実行中のプロセスを停止するには、$SYSTEM.Process.Terminate()Opens in a new tab メソッドを使用できます。

以下の例は、現在のプロセスを停止します。

  DO $SYSTEM.Process.Terminate()

以下の例は、PID 7732 のプロセスを停止します。

  DO $SYSTEM.Process.Terminate(7732)

Terminate() メソッドの効果は、現在のプロセスに対しては HALT コマンドと同じで、その他のプロセスに対しては ^RESJOB ユーティリティと同じです。

^RESJOB および ^JOBEXAM

HALT コマンドは、現在のプロセスを停止するために使用します。

^RESJOB または ^JOBEXAM ユーティリティは、その他の実行中のプロセスを停止するのに使用できます。これらのユーティリティは、現在のプロセスを停止するのには使用できません。これらは、現在のプロセスを含めて、すべての実行中のプロセスに関する情報を表示するのに使用できます。

これらのユーティリティは、%SYS ネームスペースから呼び出す必要があります。これらのユーティリティを呼び出すには、適切な特権を持っている必要があります。ユーティリティ名では、大文字と小文字が区別されます。

  • プロセス ID (PID) がわかる場合、^RESJOB を使用することで、プロセスを直接停止できます。? オプションを使用することで、すべての実行中のプロセスのリストを表示できます。

  • ^JOBEXAM を使用すると、すべての実行中のプロセスのリストがまず表示されます。その後、停止 (終了)、中断、または再開するプロセスを指定できます。View^JOBEXAM を使用しても、すべての実行中のプロセスのリストを表示できますが、プロセスを停止、中断、および再開するオプションはありません。

以下は、ターミナルからの ^RESJOB の呼び出し例です。

%SYS>DO ^RESJOB
 
Force a process to quit Cache
 
Process ID (? for status report): 7732

Process ID (? for status report):
 
%SYS>

プロンプトで、停止するプロセスのプロセス ID (PID) を入力します。^RESJOB はプロセスを停止し、次のプロセス ID の入力を求めるプロンプトを表示します。プロセス ID の入力が終了したら、プロンプトで Enter キーを押します。プロンプトで ? を指定すると、現在実行中のプロセスのリストを表示できます。

  • 現在のプロセス:現在のプロセスを ^RESJOB を使用して停止しようとすると、失敗して次のメッセージが表示されます。[これは現在のプロセスであり、KILL は続行されません。]^RESJOB は、別のプロセス ID の入力を求めるプロンプトを表示します。

  • 実行していないプロセス:実行していないプロセスの ID を指定すると、失敗して次のメッセージが表示されます。[そのような Cache プロセスはありません]^RESJOB は、別のプロセス ID の入力を求めるプロンプトを表示します。

  • システム・プロセス:特定のシステム・プロセスを停止するために ^RESJOB を使用することはできません。使用を試みると、失敗して次のメッセージが表示されます。[name プロセスに KILL を実行することはできません。]^RESJOB は、別のプロセス ID の入力を求めるプロンプトを表示します。

  • ^RESJOB を使用して進行中のトランザクションがあるプロセスを停止することは、そのプロセス内で HALT コマンドを発行することと同じです。非インタラクティブ・プロセスは未完了のトランザクションをロール・バックします。インタラクティブ・プロセスは、そのターミナル・プロンプトで、未完了のトランザクションのコミットまたはロール・バックを求めるプロンプトを表示します。

関連項目

FeedbackOpens in a new tab