终止当前进程的执行。
HALT
,$SYSTEM.Process.Terminate()
,^RESJOB
HALT
与HANG
命令具有相同的最小缩写HANG
区别在于它所需的挂起时间参数。HALT
终止进程时,系统会自动释放所有锁定并关闭该进程拥有的所有设备Halt
命令的执行被停止陷阱中断。停止陷阱是使用$HALT
特殊变量建立的。$HALT
是HALT
命令的回调.HALT:pc
H:pc
HALT
命令终止当前进程的执行。如果在当前上下文(或以前的上下文)中定义了$HALT
特殊变量,则发出HALT
命令将调用$HALT
中指定的HALT
陷阱例程,而不是终止当前进程。通常,HALT
陷阱例程执行一些清理或报告操作,然后发出第二个HALT
命令以终止执行。
无论是通过运行例程代码遇到HALT
,还是从终端模式提示进入HALT
,HALT
的行为都是相同的。在任何一种情况下,它都会终止当前进程。
HALT
与HANG
命令具有相同的最小缩写。 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
陷阱例程并停止执行。
可使命令具有条件的可选后置条件表达式。如果后置条件表达式为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。^RESJOB
然后提示您输入另一个进程ID。^RESJOB
暂停某些系统进程。尝试这样做会失败,并显示消息Can not kill the name process。^RESJOB
然后提示输入另一个进程ID。^RESJOB
暂停正在进行事务的进程与在该进程中发出HALT
命令相同。非交互式进程回滚未完成的事务;交互式进程在其终端提示符处提示提交或回滚未完成的事务。