[613] | 1 | ZSY ;ISF/RWF - GT.M/VA system status display ;8/15/07 10:39
|
---|
| 2 | ;;8.0;KERNEL;**349**;Jul 10, 1995;Build 2
|
---|
| 3 | ; ;
|
---|
| 4 | ; Copyright 1989,2001 Sanchez Computer Associates, Inc. ;
|
---|
| 5 | ; ;
|
---|
| 6 | ; This source code contains the intellectual property ;
|
---|
| 7 | ; of its copyright holder(s), and is made available ;
|
---|
| 8 | ; under a license. If you do not know the terms of ;
|
---|
| 9 | ; the license, please stop and do not read further. ;
|
---|
| 10 | ; ;
|
---|
| 11 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
---|
| 12 | ;GT.M/VA %SY utility - status display
|
---|
| 13 | ;From the top just show by PID
|
---|
| 14 | N IMAGE,MODE
|
---|
| 15 | W !,"GT.M system status "
|
---|
| 16 | L +^XUTL("XUSYS","COMMAND"):1 I '$T G LW
|
---|
| 17 | S IMAGE=0,MODE=0 D WORK
|
---|
| 18 | Q
|
---|
| 19 | ;
|
---|
| 20 | QUERY N IMAGE,MODE,X
|
---|
| 21 | L +^XUTL("XUSYS","COMMAND"):1 I '$T G LW
|
---|
| 22 | S X=$$ASK W ! I X=-1 L -^XUTL("XUSYS","COMMAND") Q
|
---|
| 23 | S IMAGE=$P(X,"~",2),MODE=+X D WORK
|
---|
| 24 | Q
|
---|
| 25 | IMAGE N IMAGE,MODE
|
---|
| 26 | L +^XUTL("XUSYS","COMMAND"):1 I '$T G LW
|
---|
| 27 | S IMAGE=1,MODE=0 D WORK
|
---|
| 28 | Q
|
---|
| 29 | WORK ;Main driver, Will release lock
|
---|
| 30 | N NOPRIV,LOCK,PID,ACCESS,USERS,CTIME,GROUP,JTYPE,LTIME,MEMBER,PROCID
|
---|
| 31 | N TNAME,UNAME,INAME,I,SORT,OLDPRIV,TAB
|
---|
| 32 | N $ES,$ET,STATE,%PS,RTN,%OS,%T,SYSNAME,OLDINT,DONE
|
---|
| 33 | ;Save $ZINTERRUPT, set new one
|
---|
| 34 | S OLDINT=$ZINTERRUPT,$ZINTERRUPT="I $$JOBEXAM^ZU($ZPOSITION) S DONE=1"
|
---|
| 35 | ;%os = 1 for VMS, 0 = Linux.
|
---|
| 36 | S %OS=$ZV["VMS",$ET="D ERR^ZSY"
|
---|
| 37 | ;Clear old data
|
---|
| 38 | S ^XUTL("XUSYS","COMMAND")="Status"
|
---|
| 39 | S I=0 F S I=$O(^XUTL("XUSYS",I)) Q:'I K ^XUTL("XUSYS",I,"JE"),^("INTERUPT")
|
---|
| 40 | S (LOCK,NOPRIV,USERS)=0
|
---|
| 41 | U $P:CTRAP=$C(3)
|
---|
| 42 | I %OS S %T=0 D I %T D EXIT Q
|
---|
| 43 | . S OLDPRIV=$ZSETPRV("SYSLCK,GROUP,WORLD")
|
---|
| 44 | . I '$ZPRIV("SYSLCK") S %T=1 W !,"You need SYSLCK privilege to run this program.",!
|
---|
| 45 | . Q
|
---|
| 46 | ;Go get the data
|
---|
| 47 | I %OS D VMS
|
---|
| 48 | I '%OS D UNIX
|
---|
| 49 | ;Now show the results
|
---|
| 50 | I USERS D
|
---|
| 51 | . D HEADER,ISHOW:IMAGE,USHOW:'IMAGE
|
---|
| 52 | . W !!,"Total ",USERS," user",$S(USERS>1:"s.",1:"."),!
|
---|
| 53 | . Q
|
---|
| 54 | E W !,"No current GT.M users.",!
|
---|
| 55 | I NOPRIV W !,"Insufficient privileges to examine ",NOPRIV," process",$S(NOPRIV>1:"es.",1:"."),!
|
---|
| 56 | EXIT ;
|
---|
| 57 | L -^XUTL("XUSYS","COMMAND") ;Release lock and let others in
|
---|
| 58 | I %OS S:$D(OLDPRIV) OLDPRIV=$ZSETPRV(OLDPRIV)
|
---|
| 59 | I $L($G(OLDINT)) S $ZINTERRUPT=OLDINT
|
---|
| 60 | U $P:CTRAP=""
|
---|
| 61 | Q
|
---|
| 62 | ;
|
---|
| 63 | ERR ;
|
---|
| 64 | U $P W !,$P($ZS,",",2,99),!
|
---|
| 65 | D EXIT
|
---|
| 66 | Q
|
---|
| 67 | ;
|
---|
| 68 | LW ;Lock wait
|
---|
| 69 | W !,"Someone else is running the System status now."
|
---|
| 70 | Q
|
---|
| 71 | ;
|
---|
| 72 | VMS ;Collect VMS process info
|
---|
| 73 | S $ET="D VERR^ZSY"
|
---|
| 74 | S SYSNAME="SYSNAME"
|
---|
| 75 | S ACCESS(0)="Detach",ACCESS(1)="Network",ACCESS(2)="Batch",ACCESS(3)="Local",ACCESS(4)="Dialup",ACCESS(5)="Remote"
|
---|
| 76 | S STATE(5)="LEF",STATE(7)="HIB",STATE(12)="COM",STATE(14)="CUR"
|
---|
| 77 | S LOCK=$ZLKID(0)
|
---|
| 78 | I LOCK D F S LOCK=$ZLKID(1) Q:'LOCK D
|
---|
| 79 | . I $EXTRACT($ZGETLKI(LOCK,"RESNAM"),1,6)="GTM$LM" S PID=$ZGETLKI(LOCK,"PID") D GETJOB(PID) W "."
|
---|
| 80 | S USERS=USERS+NOPRIV
|
---|
| 81 | Q
|
---|
| 82 | ;
|
---|
| 83 | HEADER ;Display Header
|
---|
| 84 | W # S ($X,$Y)=0
|
---|
| 85 | S TAB(1)=9,TAB(2)=25,TAB(3)=29,TAB(4)=38,TAB(5)=57,TAB(6)=66
|
---|
| 86 | W !,"GT.M Mumps users on ",$$DATETIME($H),!
|
---|
| 87 | W !,"Proc. id",?TAB(1),"Proc. name",?TAB(2),"PS",?TAB(3),"Device",?TAB(4),"Routine",?TAB(5),"MODE",?TAB(6),"CPU time"
|
---|
| 88 | W !,"--------",?TAB(1),"---------------",?TAB(2),"---",?TAB(3),"--------",?TAB(4),"--------",?TAB(5),"-------",?TAB(6)
|
---|
| 89 | Q
|
---|
| 90 | USHOW ;Display job info, sorted by pid
|
---|
| 91 | N SI,X,EXIT,DEV
|
---|
| 92 | S SI="",EXIT=0
|
---|
| 93 | F S SI=$ORDER(SORT(SI)) Q:SI=""!EXIT F I=1:1:SORT(SI) D Q:EXIT
|
---|
| 94 | . S X=SORT(SI,I)
|
---|
| 95 | . S TNAME=$P(X,"~",4),PROCID=$P(X,"~",1)
|
---|
| 96 | . S JTYPE=$P(X,"~",5),CTIME=$P(X,"~",6)
|
---|
| 97 | . S LTIME=$P(X,"~",7),PS=$P(X,"~",3)
|
---|
| 98 | . S PID=$P(X,"~",8),UNAME=$P(X,"~",2)
|
---|
| 99 | . S RTN=$G(^XUTL("XUSYS",PID,"INTERRUPT"))
|
---|
| 100 | . W !,PROCID,?TAB(1),UNAME,?TAB(2),$G(STATE(PS),PS),?TAB(3),TNAME,?TAB(4),RTN,?TAB(5),ACCESS(JTYPE),?TAB(6),$J(CTIME,6)
|
---|
| 101 | . K DEV
|
---|
| 102 | . F DI=1:1 Q:'$D(^XUTL("XUSYS",PID,"JE","D",DI)) S X=^(DI),X=$P(X,":")_":" I $TR(X,"_")'=TNAME S DEV(DI)=X
|
---|
| 103 | . S DI=0 F S DI=$O(DEV(DI)) Q:DI'>0 W !,?TAB(3),$E(DEV(DI),1,79-$X)
|
---|
| 104 | . I $Y>22 D WAIT
|
---|
| 105 | Q
|
---|
| 106 | ISHOW ;Show process sorted by IMAGE
|
---|
| 107 | N SI,X
|
---|
| 108 | S INAME="",EXIT=0
|
---|
| 109 | F S INAME=$ORDER(SORT(INAME)) Q:INAME=""!EXIT D
|
---|
| 110 | . W !,"IMAGE : ",INAME S SI=""
|
---|
| 111 | . F S SI=$ORDER(SORT(INAME,SI)) Q:SI=""!EXIT F I=1:1:SORT(INAME,SI) D Q:EXIT
|
---|
| 112 | . . S X=SORT(INAME,SI,I)
|
---|
| 113 | . . S TNAME=$P(X,"~",4),PROCID=$P(X,"~",1)
|
---|
| 114 | . . S PS=$P(X,"~",3),RTN=$P(X,"~",8)
|
---|
| 115 | . . S JTYPE=$P(X,"~",5),CTIME=$P(X,"~",6)
|
---|
| 116 | . . S LTIME=$P(X,"~",7),UNAME=$P(X,"~",2)
|
---|
| 117 | . . S RTN=$G(^XUTL("XUSYS",RTN,"INTERRUPT"))
|
---|
| 118 | . . W !,PROCID,?TAB(1),UNAME,?TAB(2),$G(STATE(PS),PS),?TAB(3),TNAME,?TAB(4),RTN,?TAB(5),ACCESS(JTYPE),?TAB(6),CTIME
|
---|
| 119 | . . I $Y>22 D WAIT
|
---|
| 120 | . W !
|
---|
| 121 | Q
|
---|
| 122 | ;
|
---|
| 123 | WAIT ;Page break
|
---|
| 124 | N Y
|
---|
| 125 | S Y=0 W !,"Press Return to continue '^' to stop: " R Y:300
|
---|
| 126 | I $E(Y)="^" S EXIT=1
|
---|
| 127 | E D HEADER
|
---|
| 128 | Q
|
---|
| 129 | ;
|
---|
| 130 | GETJOB(PID) ;Get data from a VMS job
|
---|
| 131 | N NM,SI,$ET,$ES
|
---|
| 132 | S $ET="G BLINDPID"
|
---|
| 133 | S PROCID=$$FUNC^%DH(PID,8),TNAME=$ZGETJPI(PID,"TERMINAL")
|
---|
| 134 | ZSYSTEM "@gtm$dist:mupip-intrpt.com "_PROCID ;"MUPIP INTRPT /ID="_procid
|
---|
| 135 | S NM=$ZGETJPI(PID,"PRCNAM")
|
---|
| 136 | S UNAME=$G(^XUTL("XUSYS",PID,"NM"),NM)
|
---|
| 137 | S JTYPE=$ZGETJPI(PID,"JOBTYPE"),PS=$ZGETJPI(PID,"STATE")
|
---|
| 138 | ;S RTN=PID ;$G(^XUTL("XUSYS",PID,"INTERRUPT"))
|
---|
| 139 | S LTIME=$$DATETIME($ZGETJPI(PID,"LOGINTIM")),CTIME=$$CPUTIME($ZGETJPI(PID,"CPUTIM"))
|
---|
| 140 | S SI=$S(MODE=1:CTIME,1:PID)
|
---|
| 141 | I IMAGE D
|
---|
| 142 | . S INAME=$ZGETJPI(PID,"IMAGNAME"),I=$GET(SORT(INAME,SI))+1,SORT(INAME,SI)=I
|
---|
| 143 | . S SORT(INAME,SI,I)=PROCID_"~"_UNAME_"~"_PS_"~"_TNAME_"~"_JTYPE_"~"_CTIME_"~"_LTIME_"~"_PID_"~"_INAME
|
---|
| 144 | E S I=$GET(SORT(SI))+1,SORT(SI)=I,SORT(SI,I)=PROCID_"~"_UNAME_"~"_PS_"~"_TNAME_"~"_JTYPE_"~"_CTIME_"~"_LTIME_"~"_PID
|
---|
| 145 | S USERS=USERS+1
|
---|
| 146 | Q
|
---|
| 147 | ;
|
---|
| 148 | DATETIME(HOROLOG) ;
|
---|
| 149 | Q $ZDATE(HOROLOG,"DD-MON-YY 24:60:SS","Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec")
|
---|
| 150 | ;
|
---|
| 151 | CPUTIME(S) ;
|
---|
| 152 | N T,S,M,H,D
|
---|
| 153 | S T=S#100,S=S\100 S:$L(T)=1 T="0"_T
|
---|
| 154 | S S=S#60,S=S\60 S:$L(S)=1 S="0"_S
|
---|
| 155 | S M=S#60,S=S\60 S:$L(M)=1 M="0"_M
|
---|
| 156 | S H=S#24,D=S\24 S:$L(H)=1 H="0"_H
|
---|
| 157 | Q D_" "_H_":"_M_":"_S_"."_T
|
---|
| 158 | ;
|
---|
| 159 | BLINDPID ;
|
---|
| 160 | N ZE S ZE=$ZS,$EC=""
|
---|
| 161 | I ZE["NOPRIV" S NOPRIV=NOPRIV+1
|
---|
| 162 | Q
|
---|
| 163 | VERR W !,"lock = ",LOCK,!
|
---|
| 164 | W !,$P(ZE,",",2,99),! U $P:CTRAP="" S:$D(OLDPRIV) OLDPRIV=$ZSETPRV(OLDPRIV)
|
---|
| 165 | Q
|
---|
| 166 | ASK() ;Ask sort item
|
---|
| 167 | N RES,X,GROUP
|
---|
| 168 | S RES=0,GROUP=2
|
---|
| 169 | W !,"1 pid",!,"2 cpu time",!,"3 IMAGE/pid",!,"4 IMAGE/cpu"
|
---|
| 170 | F R !,"1// ",X:600 S:X="" X=1 Q:X["^" Q:(X>0)&(X<5) W " not valid"
|
---|
| 171 | Q:X["^" -1
|
---|
| 172 | S X=X-1,RES=(X#GROUP)_"~"_(X\GROUP)
|
---|
| 173 | Q RES
|
---|
| 174 | ;
|
---|
| 175 | UNIX ;PUG/TOAD - Kernel System Status Report for GT.M
|
---|
| 176 | ;S $ZT="ZG "_$ZL_":UERR^ZSY"
|
---|
| 177 | N %FILE,%LINE,%TEXT,%I,U,%J,STATE,$ET,$ES
|
---|
| 178 | S $ET="D UERR^ZSY"
|
---|
| 179 | S %FILE="/tmp/_gtm_sy_"_$J_".tmp"
|
---|
| 180 | ;ZSYSTEM "ps ef -C mumps>"_%FILE
|
---|
| 181 | ZSYSTEM "ps eo pid,tty,stat,time,cmd -C mumps>"_%FILE
|
---|
| 182 | S %I=$I,U="^"
|
---|
| 183 | O %FILE:(readonly)
|
---|
| 184 | ;
|
---|
| 185 | ; Get lines of text from temp file
|
---|
| 186 | U %FILE F R %TEXT Q:%TEXT="" D
|
---|
| 187 | . S %LINE=$$VPE(%TEXT," ",U) ; parse each line of the ps output
|
---|
| 188 | . Q:$P(%LINE,U)="PID" ; header line
|
---|
| 189 | . D JOBSET
|
---|
| 190 | ;
|
---|
| 191 | U %I C %FILE:DELETE
|
---|
| 192 | Q
|
---|
| 193 | ;
|
---|
| 194 | UERR ;Linux Error
|
---|
| 195 | N ZE S ZE=$ZS,$EC="" U $P
|
---|
| 196 | ZSHOW "*"
|
---|
| 197 | Q ;halt
|
---|
| 198 | ;
|
---|
| 199 | JOBSET ;Get data from a Linux job
|
---|
| 200 | S (IMAGE,INAME,UNAME,PS,TNAME,JTYPE,CTIME,LTIME,RTN)=""
|
---|
| 201 | S (%J,PID,PROCID)=$P(%LINE,U)
|
---|
| 202 | S TNAME=$P(%LINE,U,2) S:TNAME="?" TNAME="" ; TTY, ? if none
|
---|
| 203 | S PS=$P(%LINE,U,3) ; process STATE
|
---|
| 204 | S PS=$S(PS="D":"lef",PS="R":"com",PS="S":"hib",1:PS)
|
---|
| 205 | S CTIME=$P(%LINE,U,4) ;cpu time
|
---|
| 206 | S JTYPE=$P(%LINE,U,6),ACCESS(JTYPE)=JTYPE
|
---|
| 207 | ZSYSTEM "mupip intrpt "_%J
|
---|
| 208 | S UNAME=$G(^XUTL("XUSYS",%J,"NM"))
|
---|
| 209 | S RTN="" ; Routine, get at display time
|
---|
| 210 | S SI=$S(MODE=0:PID,MODE=1:CTIME,1:PID)
|
---|
| 211 | I IMAGE D
|
---|
| 212 | . S INAME="mumps",I=$GET(SORT(INAME,SI))+1,SORT(INAME,SI)=I
|
---|
| 213 | . S SORT(INAME,SI,I)=PROCID_"~"_UNAME_"~"_PS_"~"_TNAME_"~"_JTYPE_"~"_CTIME_"~"_LTIME_"~"_PID_"~"_INAME
|
---|
| 214 | E S I=$GET(SORT(SI))+1,SORT(SI)=I,SORT(SI,I)=PROCID_"~"_UNAME_"~"_PS_"~"_TNAME_"~"_JTYPE_"~"_CTIME_"~"_LTIME_"~"_PID
|
---|
| 215 | S USERS=USERS+1
|
---|
| 216 | Q
|
---|
| 217 | ;
|
---|
| 218 | VPE(%OLDSTR,%OLDDEL,%NEWDEL) ; $PIECE extract based on variable length delimiter
|
---|
| 219 | N %LEN,%PIECE,%NEWSTR
|
---|
| 220 | S %STRING=$G(%STRING)
|
---|
| 221 | S %OLDDEL=$G(%OLDDEL) I %OLDDEL="" S %OLDDEL=" "
|
---|
| 222 | S %LEN=$L(%OLDDEL)
|
---|
| 223 | ; each %OLDDEL-sized chunk of %OLDSTR that might be delimiter
|
---|
| 224 | S %NEWDEL=$G(%NEWDEL) I %NEWDEL="" S %NEWDEL="^"
|
---|
| 225 | ; each piece of the old string
|
---|
| 226 | S %NEWSTR="" ; new reformatted string to return
|
---|
| 227 | F Q:%OLDSTR="" D
|
---|
| 228 | . S %PIECE=$P(%OLDSTR,%OLDDEL)
|
---|
| 229 | . S $P(%OLDSTR,%OLDDEL)=""
|
---|
| 230 | . S %NEWSTR=%NEWSTR_$S(%NEWSTR="":"",1:%NEWDEL)_%PIECE
|
---|
| 231 | . F Q:%OLDDEL'=$E(%OLDSTR,1,%LEN) S $E(%OLDSTR,1,%LEN)=""
|
---|
| 232 | Q %NEWSTR
|
---|
| 233 | ;
|
---|
| 234 | INTRPT ;List jobs that set INTRUPT.
|
---|
| 235 | N J
|
---|
| 236 | S J=0
|
---|
| 237 | F S J=$O(^XUTL("XUSYS",J)) Q:J'>0 S X=$G(^XUTL("XUSYS",J,"INTERRUPT")) I $L(X) W !,J,?10,X
|
---|
| 238 | Q
|
---|