第十一章 Caché 命令大全 HALT 命令

第十一章 Caché 命令大全 HALT 命令

终止当前进程的执行。

重要

  1. 暂停进程的三种方式 HALT,$SYSTEM.Process.Terminate(),^RESJOB
  2. HALTHANG命令具有相同的最小缩写
    HANG区别在于它所需的挂起时间参数。
  3. HALT终止进程时,系统会自动释放所有锁定并关闭该进程拥有的所有设备
  4. Halt命令的执行被停止陷阱中断。停止陷阱是使用$HALT特殊变量建立的。$HALTHALT命令的回调.

大纲

HALT:pc
H:pc

参数

  • pc 可选,后置表达式

描述

HALT命令终止当前进程的执行。如果在当前上下文(或以前的上下文)中定义了$HALT特殊变量,则发出HALT命令将调用$HALT中指定的HALT陷阱例程,而不是终止当前进程。通常,HALT陷阱例程执行一些清理或报告操作,然后发出第二个HALT命令以终止执行。

无论是通过运行例程代码遇到HALT,还是从终端模式提示进入HALTHALT的行为都是相同的。在任何一种情况下,它都会终止当前进程。

HALTHANG命令具有相同的最小缩写。 HANG区别在于它所需的挂起时间参数。

HALT的效果

HALT终止进程时,系统会自动释放所有锁定并关闭该进程拥有的所有设备。 这可确保暂停的进程不会留下锁定的变量或未释放的设备。

如果在HALT终止进程时存在正在进行的事务,则事务的解决取决于进程的类型。后台JOB(非交互进程)的HALT总是回滚正在进行的事务。交互进程中的HALT(例如使用CachéTerminal运行例程)会提示解决正在进行的事务。提示如下:

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命令本身。

如果已经为较低的上下文帧建立了停止陷阱,则HALT命令从帧堆栈中移除上下文帧,直到到达具有停止陷阱的上下文帧。然后,HALT调用由$HALT指定的HALT陷阱例程并停止执行。

参数

pc

可使命令具有条件的可选后置条件表达式。如果后置条件表达式为TRUE(计算结果为非零数值),则Caché执行HALT命令。如果后置条件表达式为假(计算结果为零),则Caché不执行该命令。

示例

在下面的示例中,HALT允许用户结束当前应用程序并返回到操作系统。系统将为用户执行所有必要的清理。注意命令中后置条件的用法。

/// d ##class(PHA.TEST.Command).TestHALT()
ClassMethod TestHALT()
{
Main
	READ !,"你真的想停止吗 (Y or N)? ",ans QUIT:ans=""
	HALT:(ans["Y")!(ans="y")
	DO Start
Start()
	WRITE !,"这是启动例程"
	QUIT
}
```java
输入`Y`,终端直接停止消失。

在以下示例中,`HALT`调用`$HALT`中指定的`HALT`陷阱例程。在本例中,实际停止执行的是第二个HALT命令。(出于演示目的,此示例使用挂起语句,以便有时间查看显示的输出。)
```java
/// d ##class(PHA.TEST.Command).TestHALTStack()
ClassMethod TestHALTStack()
{
Main
	NEW $ESTACK
	SET $HALT="OnHalt"
	WRITE !,"Main $ESTACK= ",$ESTACK   // 0
	HANG 2
	DO SubA
	WRITE !,"这应该永远不会显示"
SubA()
	WRITE !,"SubA $ESTACK= ",$ESTACK   // 1
	HANG 2
	HALT    // 调用OnHalt例程
	WRITE !,"这应该永远不会显示"
OnHalt()
	WRITE !,"OnHalt $ESTACK= ",$ESTACK   // 0
	HANG 2
	// 清理和报告操作
	HALT   // 实际停止当前进程
}
DHC-APP>d ##class(PHA.TEST.Command).TestHALTStack()
 
Main $ESTACK= 0
SubA $ESTACK= 1
OnHalt $ESTACK= 0
 HANG 2
 ^
<INTERRUPT>zTestHALTStack+15^PHA.TEST.Command.1

$SYSTEM.Process.Terminate()

可以使用$SYSTEM.Process.Terminate()方法暂停当前进程或暂停其他正在运行的进程。

下面的示例暂停当前进程:

 DO $SYSTEM.Process.Terminate()

以下示例使用PID 123停进程:

  DO $SYSTEM.Process.Terminate(123)

Terminate()方法的效果与当前进程的HALT命令或其他进程的^RESJOB实用程序相同。

^RESJOB and ^JOBEXAM

HALT命令用于暂停当前进程。

^RESJOB^JOBEXAM实用程序可用于暂停其他正在运行的进程。这些实用程序不能用于停止当前进程。它们可用于显示所有正在运行的进程的信息,包括当前进程。

必须从%SYS命名空间调用这些实用程序。必须具有适当的权限才能调用这些实用程序。实用程序名称区分大小写。

  • ^RESJOB允许在知道进程ID(PID)的情况下直接停止进程。选项以显示所有正在运行的进程的列表。
  • ^JOBEXAM首先显示所有正在运行的进程的列表,然后允许指定要暂停(终止)、挂起或恢复的进程。View ^JOBEXAM允许显示所有正在运行的进程的列表;它不提供暂停、挂起或恢复进程的选项。
    实际上输入的是 DO ^JOBEXAM
%SYS>View ^JOBEXAM
 
VIEW ^JOBEXAM
                 Cache for Windows (x86-64) 2016.2 (Build 736U)
 Job# NSpace  Routine        Commands   Globals State PID      Current device
    1         CONTROL               0         0 RUNW  6704
    2         WRTDMN              189      4272 RUNW  6724
    3         GARCOL                0         0 RUNW  6856
    4         JRNDMN            73004         0 RUNW  6852
    5         EXPDMN                0         0 RUNW  6888
    6 DHC-APP %SYS.BINDSRV   39773774   3691257 READ  7584     LAPTOP-ARLL:1972
                 Cache for Windows (x86-64) 2016.2 (Build 736U)
 Job# NSpace  Routine        Commands   Globals State PID      Current device
    1         CONTROL               0         0 RUNW  6704
    2         WRTDMN              190      4273 RUNW  6724
    3         GARCOL                0         0 RUNW  6856
    4         JRNDMN            73018         0 RUNW  6852
    5         EXPDMN                0         0 RUNW  6888
    6 DHC-APP %SYS.BINDSRV   39773774   3691257 READ  7584     LAPTOP-ARLL:1972
    7 %SYS    MONITOR          417060        74 EVTW  9140     //./nul
    8 %SYS    CLNDMN             7980       519 RUNW  8040     //./nul
    9 %SYS    ECPWork               0         0 RUNW  9788     //./nul
   10 %SYS    %SYS.SERVER           0         0 READ  11716    1972:
   11 %SYS    LMFMON           234918       211 HANGW 11772    //./nul
   12 %SYS    %SYS.ProcessQuery 55340      1765 RUN   5944     |TRM|:|5944
   14 %SYS    %SYS.TaskSuper   936403     37733 EVTW  9664     //./nul
   15 %SYS    %SYS.Monitor.C<50858259    492740 EVTW  9436     //./nul
   21 %SYS    RECEIVE          251669     13253 HANGW 9336     //./nul
 
 
 
 
 
(N)ext,(P)rev,(G)oto,(E)xamine,(T)erminate,(S)uspend,(R)esume,(Q)uit =>

以下是从终端调用^RESJOB的示例:

%SYS>DO ^RESJOB
 
Force a process to quit Cache
 
Process ID (? for status report): ?
 
 
                   Cache System Status:  7:28 pm 27 Jun 2020
 Process  Device      Namespace      Routine         CPU,Glob  Pr User/Location
    6704                             CONTROL           0,0     8
    6724                             WRTDMN          190,4273  9
    6856                             GARCOL            0,0     8
    6852                             JRNDMN        73043,0     8
    6888                             EXPDMN            0,0     8
    7584  |TCP|LAPTOP-ARLL3DSO:1972
                      DHC-APP        %SYS.BINDSRV
                                                39775764,3691323
                                                               8  _SYSTEM
    9140  //./nul     %SYS           MONITOR      417060,74    8
    8040  //./nul     %SYS           CLNDMN         7980,519   8
    9788  //./nul     %SYS           ECPWork           0,0     8  ECPWORK
   11716  |TCP|1972   %SYS           %SYS.SERVER       0,0     8
   11772  //./nul     %SYS           LMFMON       235173,211   8
    5944* |TRM|:|5944 %SYS           %SYS.ProcessQuery
                                                   60545,1784  8  yx
    9664  //./nul     %SYS           %SYS.TaskSuper
                                                  936403,37733 8  TASKMGR
    9436  //./nul     %SYS           %SYS.Monitor.Control
                                                50866372,4928308
    9336  //./nul     %SYS           RECEIVE      251669,13253 8
 
3 user, 12 system, 2048 mb global/512 mb routine cache
 
 
Process ID (? for status report):

在提示符下,键入要暂停的进程的进程ID(PID)。^RESJOB暂停进程,然后提示输入下一个进程ID。输入完进程ID后,在提示符下按Enter键。你能指定吗?在提示下显示当前正在运行的进程列表。

  • 当前进程:尝试使用^RESJOB停止当前进程失败,并显示消息这是的当前进程,不能继续终止。^RESJOB然后提示输入另一个进程ID。
  • 未运行进程:指定未运行进程的进程ID失败,并显示消息[无此Caché ]。^RESJOB然后提示您输入另一个进程ID。
  • 系统进程:不能使用^RESJOB暂停某些系统进程。尝试这样做会失败,并显示消息Can not kill the name process。^RESJOB然后提示输入另一个进程ID。
  • 正在进行的事务:使用^RESJOB暂停正在进行事务的进程与在该进程中发出HALT命令相同。非交互式进程回滚未完成的事务;交互式进程在其终端提示符处提示提交或回滚未完成的事务。

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/107280171
今日推荐