- KBANTCLN ; VEN/SMH - Clean Taskman Environment ;2018-03-21 10:57 AM
- ;;nopackage;0.2
- ; License: Public Domain
- ; Author not responsible for use of this routine.
- ; Author coyly recommends not using this on production accounts.
- ;
- ; This routine cleans up Taskman globals for a new environment.
- W "WARNING: DO NOT RUN THIS ON A PRODUCTION ENVIRONMENT.",!
- ;
- N VOL,UCI,SITENUMBER,SITENAME,FQDN
- R "VOL: ",VOL,!
- R "UCI: ",UCI,!
- R "SITE NUMBER: ",SITENUMBER,!
- R "SITE NAME: ",SITENAME,!
- R "SITE DOMAIN: ",FQDN,!
- D START(VOL,UCI,SITENUMBER,SITENAME,FQDN)
- QUIT
- ;
- START(VOL,UCI,SITENUMBER,SITENAME,FQDN,SOFTCLN)
- I $G(VOL)="" S VOL="ROU"
- I $G(UCI)="" S UCI="VAH"
- I $G(SITENUMBER)="" S SITENUMBER=999
- I $G(SITENAME)="" S SITENAME="DEMO SYSTEM"
- I $G(FQDN)="" S FQDN="LOCALHOST"
- I $G(SOFTCLN)="" S SOFTCLN=0
- S IO=$P,U="^"
- D ZTMGRSET(VOL,UCI)
- D DINIT(SITENUMBER,SITENAME)
- D ZUSET
- D MSP
- D TASKMAN(SOFTCLN)
- D DEVCLEAN
- QUIT
- ;
- ZTMGRSET(VOL,UCI) ; Silent ZTMGRSET Replacement
- ; NB: OS 3 is Cache
- ; OS 8 is GT.M/Unix
- ;
- K ^%ZOSF
- N ZTOS
- N ZTMODE S ZTMODE=1
- N SCR S SCR=" I 1"
- N %S,%D
- I $L($SY,":")=2 D ; D 3^ZTMGRSET
- . S ZTOS=3
- . N I,X F I=1:2 S Z=$P($T(Z+I^ZOSFONT),";;",2) Q:Z="" S X=$P($T(Z+1+I^ZOSFONT),";;",2,99) S ^%ZOSF(Z)=X
- . S ^%ZOSF("GSEL")="K ^CacheTempJ($J),^UTILITY($J) D ^%SYS.GSET M ^UTILITY($J)=CacheTempJ($J)"
- . S ^%ZOSF("OS")="OpenM-NT^18"
- . S %S="ZOSVONT^ZTBKCONT^ZIS4ONT^ZISFONT^ZISHONT^XUCIONT"
- . D DES^ZTMGRSET,MOVE^ZTMGRSET
- . S %S="ZISTCPS^ZTMDCL",%D="%ZISTCPS^%ZTMDCL"
- . D MOVE^ZTMGRSET
- . D RUM^ZTMGRSET
- ;
- ;
- ;
- I +$SY=47 D ; 8^ZTMGRSET
- . S ZTOS=8
- . N I,X F I=1:2 S Z=$P($T(Z+I^ZOSFGUX),";;",2) Q:Z="" S X=$P($T(Z+1+I^ZOSFGUX),";;",2,99) S ^%ZOSF(Z)=X
- . S ^%ZOSF("OS")="GT.M (Unix)^19"
- . S ^%ZOSF("TMP")="/tmp/"
- . ;
- . S %ZE=".m" D init^%RSEL
- . S %S="ZOSVGUX^^ZIS4GTM^ZISFGTM^ZISHGUX^XUCIGTM"
- . D DES^ZTMGRSET,MOVE^ZTMGRSET
- . S %S="ZOSV2GTM^ZISTCPS",%D="%ZOSV2^%ZISTCPS"
- . D MOVE^ZTMGRSET
- . ;
- S %S="DIDT^DIDTC^DIRCR",%D="%DT^%DTC^%RCR"
- D MOVE^ZTMGRSET
- D ALL^ZTMGRSET
- D GLOBALS^ZTMGRSET
- S (^%ZOSF("MGR"),^%ZOSF("PROD"))=UCI_","_VOL
- S ^%ZOSF("VOL")=VOL
- D MES^ZTMGRSET("ALL DONE",1)
- Q
- ;
- DINIT(SITENUMBER,SITENAME) ; Silent Dinit Replacement
- S ^DD("SITE")=SITENAME
- S ^DD("SITE",1)=SITENUMBER
- D
- . I +$SY=47 S ^DD("OS")=$$FIND1^DIC(.7,,"QX","GT.M(UNIX)")
- . I +$SY=0 S ^DD("OS")=$$FIND1^DIC(.7,,"QX","CACHE/OpenM")
- D:$T(NOASK^DINIT)]"" NOASK^DINIT
- ;
- ; Fix ZSAVE bug causing END tag in TIUXRC2 to appear twice - % not newed (https://groups.google.com/forum/#!topic/hardhats/FEeTqYJZVSQ)
- I $P($T(+2^DI),";",3)="22.0" S $P(^DD("OS",19,"ZS"),"%I")="N %,"
- QUIT
- ;
- ZUSET ;
- D POST^ZUSET
- QUIT
- ;
- TASKMAN(SOFTCLN) ; Taskman Stuff --> Ends at TEND
- CONST ; Constant Integers
- N KMAXJOB S KMAXJOB=30 ; Maximum M processes on the system
- ;
- ENV ; We get environment variables here.
- S U="^"
- ;
- N Y D GETENV^%ZOSV ; Y=UCI^VOL^NODE^BOX LOOKUP
- N UCI S UCI=$P(Y,U)
- N VOL S VOL=$P(Y,U,2)
- N NODE S NODE=$P(Y,U,3) ; Cache Namespace on Cache; $gtm_sysid on GT.M.
- N BOX S BOX=$P(Y,U,4) ; VOL:NODE
- ;
- KSP ; Kernel System Parameters cleanup. Fall through.
- N KBANI S KBANI=0
- N GREFC S GREFC=$$ROOT^DILFD(8989.304,",1,",1) ; Closed File Root for Volume Multiple
- N GREFO S GREFO=$$ROOT^DILFD(8989.304,",1,",0) ; Open File Root for Volume Multiple
- F S KBANI=$O(@GREFC@(KBANI)) Q:'KBANI D
- . N DA,DIK S DA(1)=1,DA=KBANI,DIK=GREFO D ^DIK ; Kill each entry in Vol subfile
- ;
- ; DEBUG.ASSERT - Make sure that the file is empty
- I $D(@GREFC)#10 S $EC=",U1,"
- ; DEBUG.ASSERT
- ;
- N KBANFDA
- S KBANFDA(8989.304,"+1,1,",.01)=VOL
- S KBANFDA(8989.304,"+1,1,",2)=30 ; 30 jobs by default.
- ;
- N KBANERR ; For errors
- D UPDATE^DIE("E",$NA(KBANFDA),"",$NA(KBANERR)) ; File data
- I $D(KBANERR) S $EC=",U1," ; if error filing, crash
- ;
- ; DEFAULT AUTO SIGN-ON -> Turn off. Causes problems with internet machines.
- K KBANFDA,KBANERR
- S KBANFDA(8989.3,1_",",218)="d"
- ;
- ; DNS
- S KBANFDA(8989.3,1_",",51)="9.9.9.9"
- ;
- ; Primary HFS Directory
- ; NB: Never tested Cache/NT with c:\windows\temp. I don't have it anywhere to check.
- N OS S OS=$$VERSION^%ZOSV(1)
- S KBANFDA(8989.3,1_",",320)=$S(OS["Linux":"/dev/shm/",OS["NT":"c:\windows\temp\",1:"/tmp/") ; $I
- ;
- D FILE^DIE(,$NA(KBANFDA),$NA(KBANERR))
- I $D(KBANERR) S $EC=",U1," ; if error filing, crash
- ;
- F14P5 ; 14.5 clean-up. Fall through.
- D KF(14.5) ; Bye bye file 14.5
- ;
- N KBANFDA
- S KBANFDA(14.5,"+1,",.01)=VOL ; Volume Set
- S KBANFDA(14.5,"+1,",.1)="GENERAL PURPOSE VOLUME SET" ; Type
- S KBANFDA(14.5,"+1,",1)="NO" ; Inhibit Logons?
- S KBANFDA(14.5,"+1,",2)="" ; Link Access?
- S KBANFDA(14.5,"+1,",3)="NO" ; Out of Service?
- S KBANFDA(14.5,"+1,",4)="NO" ; Required Volume Set
- S KBANFDA(14.5,"+1,",5)=UCI ; Taskman Files UCI
- S KBANFDA(14.5,"+1,",6)="" ; Taskman Files Volume Set
- S KBANFDA(14.5,"+1,",7)="" ; Replacement Volume Set
- S KBANFDA(14.5,"+1,",8)=0 ; Days to keep old tasks
- S KBANFDA(14.5,"+1,",9)="Yes" ; Signon/Production Volume Set
- ;
- N KBANERR ; For errors
- D UPDATE^DIE("E",$NA(KBANFDA),"",$NA(KBANERR)) ; File data
- I $D(KBANERR) S $EC=",U1," ; if error filing, crash
- ;
- F14P6 ; 14.6 clean-up. Fall through
- D KF(14.6) ; Bye bye file 14.6
- ;
- F14P7 ; 14.7 clean-up. Fall through
- D KF(14.7) ; Bye bye file 14.7
- ;
- N KBANFDA
- S KBANFDA(14.7,"+1,",.01)=BOX ;BOX-VOLUME PAIR (RF), [0;1]
- S KBANFDA(14.7,"+1,",1)="" ;RESERVED (S), [0;2]
- S KBANFDA(14.7,"+1,",2)="" ;LOG TASKS? (S), [0;3]
- S KBANFDA(14.7,"+1,",3)="" ;DEFAULT TASK PRIORITY (NJ2,0), [0;4]
- S KBANFDA(14.7,"+1,",4)="" ;TASK PARTITION SIZE (NJ3,0), [0;5]
- S KBANFDA(14.7,"+1,",5)=0 ;SUBMANAGER RETENTION TIME (NJ3,0), [0;6] TODO: Better values for Cache
- S KBANFDA(14.7,"+1,",6)=.80*$$KRNMAXJ(VOL)\1 ;TASKMAN JOB LIMIT (RNJ4,0), [0;7] 80 % OF Kernel Job Limit
- S KBANFDA(14.7,"+1,",7)=0 ;TASKMAN HANG BETWEEN NEW JOBS (NJ2,0), [0;8]
- S KBANFDA(14.7,"+1,",8)="G" ;MODE OF TASKMAN (RS), [0;9]
- S KBANFDA(14.7,"+1,",9)="" ;VAX ENVIROMENT FOR DCL (F), [0;10]
- S KBANFDA(14.7,"+1,",10)="" ;OUT OF SERVICE (RS), [0;11]
- S KBANFDA(14.7,"+1,",11)=0 ;MIN SUBMANAGER CNT (NJ2,0), [0;12]
- S KBANFDA(14.7,"+1,",12)="" ;TM MASTER (P14.7'), [0;13]
- S KBANFDA(14.7,"+1,",13)="" ;Balance Interval (NJ3,0), [0;14]
- S KBANFDA(14.7,"+1,",21)="" ;LOAD BALANCE ROUTINE (F), [2;E1,75]
- S KBANFDA(14.7,"+1,",31)=1 ;Auto Delete Tasks (S), [3;1]
- S KBANFDA(14.7,"+1,",32)=1 ;Manager Startup Delay (NJ3,0), [3;2]
- ;
- N KBANERR ; For errors
- D UPDATE^DIE("",$NA(KBANFDA),"",$NA(KBANERR)) ; File data (Internal Format)
- I $D(KBANERR) S $EC=",U1," ; if error filing, crash
- ;
- I SOFTCLN D SOFTCLN QUIT
- ;
- ZTSK K ^%ZTSK ; ^%ZTSK clean-up
- ZTSCH K ^%ZTSCH ; ^%ZTSCH clen-up
- ;
- F19P2 ; 19.2 clean-up; Fall through.
- N GREFC S GREFC=$$ROOT^DILFD(19.2,"",1) ; Closed File Root for Option Scheduling
- N GREFO S GREFO=$$ROOT^DILFD(19.2,"",0) ; Open File Root for Option Scheduling
- ;
- ; Walk through entries
- N KBANI S KBANI=0
- F S KBANI=$O(@GREFC@(KBANI)) Q:'KBANI D
- . N DA,DIK S DA=KBANI,DIK=GREFO D ^DIK ; Kill each entry
- ;
- N KBANI,OPT
- N KBANFDA
- F KBANI=1:1 S OPT=$T(F19P2OPT+KBANI) Q:$P(OPT,";;",2)="<<END>>" D
- . N NODE S NODE=$P(OPT,";;",2) ; Node
- . N OS S OS=$P(NODE,U,4) ; M VM (Open-NT or GT.M)
- . I $L(OS),^%ZOSF("OS")'[OS QUIT ; If OS is defined and it's not ours, quit
- . ;
- . N NAME S NAME=$P(NODE,U)
- . N STARTUP,TIME
- . D
- . . N N2 S N2=$P(NODE,U,2)
- . . S STARTUP=$S(N2="S":"STARTUP",1:"")
- . . S TIME=$S(N2'="S":N2,1:"")
- . ;
- . N RESCHFREQ S RESCHFREQ=$P(NODE,U,3)
- . N OS S OS=$P(NODE,U,4)
- . ;
- . S KBANFDA(19.2,"+"_KBANI_",",.01)=NAME ; NAME (R*P19'), [0;1]
- . S KBANFDA(19.2,"+"_KBANI_",",2)=TIME ; QUEUED TO RUN AT WHAT TIME (DX), [0;2]
- . S KBANFDA(19.2,"+"_KBANI_",",6)=RESCHFREQ ; RESCHEDULING FREQUENCY (FX), [0;6]
- . S KBANFDA(19.2,"+"_KBANI_",",9)=$G(STARTUP) ; SPECIAL QUEUEING (SX), [0;9]
- ;
- N KBANERR ; For errors
- D UPDATE^DIE("E",$NA(KBANFDA),"",$NA(KBANERR)) ; File data (External Format)
- I $D(KBANERR) S $EC=",U1," ; if error filing, crash
- ;
- TEND QUIT ; Taskman END
- ;
- MSP ; Mailman Site Parameters Clean-up
- N KBANFDA S KBANFDA(4.3,"1,",7.5)="@" ; CPU/VOL in MSP
- N KBANERR
- D FILE^DIE("",$NA(KBANFDA),$NA(KBANERR))
- I $D(KBANERR) S $EC=",U1,"
- QUIT
- ;
- DEVCLEAN ; Device Cleanup
- DEVVOL ; Delete Volume field for each device.
- N KBANI S KBANI=0
- N KBANFDA
- F S KBANI=$O(^%ZIS(1,KBANI)) Q:'KBANI S KBANFDA(3.5,KBANI_",",1.9)="@"
- N KBANERR
- D FILE^DIE("",$NA(KBANFDA),$NA(KBANERR))
- I $D(KBANERR) S $EC=",U1,"
- ;
- DEVNULL ; Fix up null devices
- D FIND^DIC(3.5,,,"PQM","NULL")
- ;
- ; Remove old nulls
- N Z,FDA
- N KBANI F KBANI=0:0 S KBANI=$O(^TMP("DILIST",$J,KBANI)) Q:'KBANI S Z=^(KBANI,0) D
- . N IEN S IEN=$P(Z,U)
- . S FDA(3.5,IEN_",",.01)="ZZNULL"
- D FILE^DIE(,$NA(FDA))
- ;
- ; Find correct null (if present)
- N NULL
- I $P(^%ZOSF("OS"),U,2)=19 S NULL="/dev/null" ; GT.M
- I $P(^%ZOSF("OS"),U,2)=18,$$VERSION^%ZOSV(1)'["NT" S NULL="/dev/null" ; Cache non-NT
- I $P(^%ZOSF("OS"),U,2)=18,$$VERSION^%ZOSV(1)["NT" S NULL="//./NUL" ; Cache NT
- D FIND^DIC(3.5,,,"PQM",NULL)
- ;
- I +^TMP("DILIST",$J,0)>1 D
- . N KBANI F KBANI=1:0 S KBANI=$O(^TMP("DILIST",$J,KBANI)) Q:'KBANI S Z=^(KBANI,0) D
- .. N IEN S IEN=$P(Z,U)
- .. S FDA(3.5,IEN_",",.01)="ZZNULL"
- . D FILE^DIE(,$NA(FDA))
- ;
- S FDA(3.5,"?+1,",.01)="NULL" ; NAME
- S FDA(3.5,"?+1,",.02)="BIT BUCKET" ; LOCATION
- S FDA(3.5,"?+1,",1)=NULL ; $I
- S FDA(3.5,"?+1,",1.95)="@" ; SIGN-ON/SYSTEM DEVICE
- S FDA(3.5,"?+1,",2)="TERMINAL" ; TYPE
- S FDA(3.5,"?+1,",3)="P-OTHER" ; SUBTYPE
- S FDA(3.5,"?+1,",51)="@" ; OPEN COUNT
- N ERR
- D UPDATE^DIE("E",$NA(FDA),,$NA(ERR))
- I $D(DIERR) ZWRITE ERR
- ;
- DEVHFS ; Fix up HFS device
- N OS S OS=$$VERSION^%ZOSV(1)
- N HFSSUBTYPE S HFSSUBTYPE=$$FIND1^DIC(3.2,,"PQX","P-HFS/80/99999")
- I 'HFSSUBTYPE S HFSSUBTYPE=$$FIND1^DIC(3.2,,"PQX","P-OTHER")
- N OPENPAR S OPENPAR=$S($P(^%ZOSF("OS"),U,2)=19:"(nowrap:stream:newversion)",$P(^%ZOSF("OS"),U,2)=18:"""NWS""") ; Yes, crash if not 18 or 19.
- ;
- N FDA
- S FDA(3.5,"?+1,",.01)="HFS" ; NAME
- S FDA(3.5,"?+1,",.02)="Host File Device" ; LOCATION
- S FDA(3.5,"?+1,",1)=$S(OS["Linux":"/dev/shm/hfs.dat",OS["NT":"c:\hfs.dat",1:"/tmp/hfs.dat") ; $I
- S FDA(3.5,"?+1,",1.95)="@" ; SIGN-ON/SYSTEM DEVICE
- S FDA(3.5,"?+1,",2)="HOST FILE SERVER" ; TYPE
- S FDA(3.5,"?+1,",3)="`"_HFSSUBTYPE ; SUBTYPE
- S FDA(3.5,"?+1,",51)="@" ; OPEN COUNT
- S FDA(3.5,"?+1,",4)="@" ; ASK DEVICE
- S FDA(3.5,"?+1,",5)="@" ; ASK PARAMETERS
- S FDA(3.5,"?+1,",5.1)="YES" ; ASK HOST FILE
- S FDA(3.5,"?+1,",5.2)="@" ; ASK HFS I/O OPERATION
- S FDA(3.5,"?+1,",19)=OPENPAR ; OPEN PARAMETERS
- ;
- N ERR
- D UPDATE^DIE("E",$NA(FDA),,$NA(ERR))
- I $D(DIERR) ZWRITE ERR
- ;
- DEVTTY ; Fix TTY
- N OS S OS=$$VERSION^%ZOSV(1)
- N dI S dI=$S(OS["Linux":"/dev/tty",OS["NT":"|TRM|",1:"/dev/tty")
- N ttyIEN s ttyIEN=$$FIND1^DIC(3.5,,"MQ",dI)
- ;
- N FDA,IENS
- i ttyIEN S IENS=ttyIEN_","
- e s IENS="+1,"
- S FDA(3.5,IENS,.01)="CONSOLE"
- S FDA(3.5,IENS,.02)="Computer Console" ; LOCATION
- S FDA(3.5,IENS,1)=dI ; $I
- S FDA(3.5,IENS,2)="VIRTUAL TERMINAL" ; TYPE
- N VTIEN S VTIEN=$$FIND1^DIC(3.2,,"XQ","C-VT220")
- I 'VTIEN S VTIEN=$$FIND1^DIC(3.2,,"XQ","C-VT100")
- S FDA(3.5,IENS,3)="`"_VTIEN
- N ERR,IEN
- i ttyIEN D FILE^DIE("E",$NA(FDA),$NA(ERR)) i 1
- e D UPDATE^DIE("E",$NA(FDA),$NA(IEN),$NA(ERR)) S IENS=IEN(1)_","
- I $D(DIERR) ZWRITE ERR B
- ;
- N FDA,ERR
- S FDA(3.5,IENS,1.95)=1 ; SIGN-ON/SYSTEM DEVICE
- D FILE^DIE(,$NA(FDA),$NA(ERR))
- I $D(DIERR) ZWRITE ERR B
- ;
- DEVPTS ; Fix PTS
- N OS S OS=$$VERSION^%ZOSV(1)
- N dI S dI=$S(OS["Linux":"/dev/pts",OS["NT":"|TNT|",OS["CYGWIN":"/dev/cons",OS["Darwin":"/dev/ttys",1:"/dev/pts")
- N ptyIEN s ptyIEN=$$FIND1^DIC(3.5,,"MQ",dI)
- ;
- i ptyIEN S IENS=ptyIEN_","
- e s IENS="+1,"
- N FDA
- S FDA(3.5,IENS,.01)="VIRTUAL TERMINAL"
- S FDA(3.5,IENS,.02)="Virtual Terminal" ; LOCATION
- S FDA(3.5,IENS,1)=dI ; $I
- S FDA(3.5,IENS,2)="VIRTUAL TERMINAL" ; TYPE
- N VTIEN S VTIEN=$$FIND1^DIC(3.2,,"XQ","C-VT220")
- I 'VTIEN S VTIEN=$$FIND1^DIC(3.2,,"XQ","C-VT100")
- S FDA(3.5,IENS,3)="`"_VTIEN
- N ERR,IEN
- i ptyIEN D FILE^DIE("E",$NA(FDA),$NA(ERR)) i 1
- e D UPDATE^DIE("E",$NA(FDA),$NA(IEN),$NA(ERR)) S IENS=IEN(1)_","
- I $D(DIERR) ZWRITE ERR B
- ;
- N FDA,ERR
- S FDA(3.5,IENS,1.95)=1 ; SIGN-ON/SYSTEM DEVICE
- D FILE^DIE(,$NA(FDA),$NA(ERR))
- I $D(DIERR) ZWRITE ERR B
- QUIT
- ;
- ;
- F19P2OPT ; Map: Option Name; Startup or time to schedule; resched freq; OS-specific
- ;;XWB LISTENER STARTER^S
- ;;XUSER-CLEAR-ALL^S
- ;;XUDEV RES-CLEAR^S
- ;;XOBV LISTENER STARTUP^S
- ;;XMMGR-START-BACKGROUND-FILER^S
- ;;XMAUTOPURGE^T+1@0010^1D
- ;;XMCLEAN^T+1@0015^1D
- ;;XQBUILDTREEQUE^T+1@0020^1D
- ;;XQ XUTL $J NODES^T+1@0025^1D
- ;;XUERTRP AUTO CLEAN^T+1@0030^1D
- ;;XUTM QCLEAN^T+1@0035^1D
- ;;XMMGR-PURGE-AI-XREF^T+1@0040^1D
- ;;<<END>>
- ;;
- SOFTCLN ; [Private] Soft clean tasks -- don't delete them as in a brand new system
- K ^%ZTSCH("ER")
- K ^%ZTSCH("STATUS")
- K ^%ZTSCH("MON")
- K ^%ZTSCH("WAIT")
- K ^%ZTSCH("SYNC")
- K ^%ZTSCH("STARTUP")
- K ^%ZTSCH("DEVTRY")
- K ^%ZTSCH("IO")
- K ^%ZTSCH("LINK")
- K ^%ZTSCH("SUB")
- N X,Y
- S X=0 F S X=$O(^%ZTSK(X)) Q:'X D
- . I '$D(^%ZTSK(X,0)) QUIT
- . N Y S Y=^%ZTSK(X,0)
- . S $P(Y,"^",4)=UCI
- . S $P(Y,"^",11)=UCI
- . S $P(Y,"^",12)=VOL
- . S $P(Y,"^",14)=UCI
- . S ^%ZTSK(X,0)=Y
- QUIT
- ;
- KF(FN,IENS) ; Kill File; Private Procedure
- ; FN = File Number; pass by value. Required.
- ; IENS = IENs; pass by value. Optional.
- ; NB: Will not work for files under ^DIC as this deletes their definition as well
- N GREF S GREF=$$ROOT^DILFD(FN,$G(IENS),1) ; Close File Root
- Q:GREF["^DIC" ; Don't delete files stored in ^DIC
- Q:GREF="" ; No invalid files.
- N % S %=@GREF@(0) ; Save off zero node
- S $P(%,U,3,4)="" ; remove last touched and newest record markers
- K @GREF ; bye
- S @GREF@(0)=% ; restore zero node
- QUIT
- KRNMAXJ(VOL) ; Max Jobs on this volume in the Kernel; Private $$
- N X S X=$O(^XTV(8989.3,1,4,"B",VOL,0))
- N J S J=$S(X>0:^XTV(8989.3,1,4,X,0),1:"ROU^^1")
- Q $P(J,U,3)