HL7MultilistenerSetupXINETD.txt Need to run this to make the HL7 multilistener work, and replace the HLCSGTM.m, XOBVGTM.m and XWBTCP.mroutine with Wally's routine dated 8/13/07 and you need to have xinetd set up with the connection to the entry point. The 3 routines follow as do sample files for XINETD. To see it work with the sample Java application, you have to set up a Logical Link. See an example at the end. Setup of the test file on Debian: NEED TO ADD THIS TO THIS DOCUMENT. You need to modify the entry for the error trap as well like this. S ^%ZOSF("TRAP")="$ZT=$S($L(X):""G ""_X,1:"""")" Wally's new routines, HLCSGTM.m, XOBVGTM.m and XWBTCP.m below : HLCSGTM ;OIFO-O/RWF - (TCP/IP) GT.M Linux ;08/13/2007 ;;1.6;HEALTH LEVEL SEVEN;**122**;Oct 13, 1995;Build 5 ;Per VHA Directive 2004-038, this routine should not be modified. ; ; 1. port number is input from VMS COM file, such as HLSxxxxDSM.COM, ; HLSxxxxCACHE.COM, or HLSxxxxGTM.COM file, where xxxx is port ; number. ; 2. find the ien of #870(logical link file) for the multi-listener Q ; IEN(HLPORT) ; ; HLIEN870: ien in #870 (logical link file) ; HLPRTS: port number in entry to be tested ; N HLPRTS,HLIEN870 I '$G(HLPORT) D ^%ZTER Q S HLIEN870=0 F S HLIEN870=$O(^HLCS(870,"E","M",HLIEN870)) Q:'HLIEN870 D Q:(HLPRTS=HLPORT) . S HLPRTS=$P(^HLCS(870,HLIEN870,400),"^",2) I 'HLIEN870 D ^%ZTER Q ; Q HLIEN870 ; GTMLNX ; From Linux xinetd script ;Get port from ZSHOW "D" S U="^",$ZT="",$ET="D ^%ZTER HALT" ;Setup the error trap ; GTM specific code S IO=$P X "U IO:(nowrap:nodelimiter:IOERROR=""TRAP"")" ;Setup device S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") K ^TMP($J) ZSHOW "D":^TMP($J) F %=1:1 Q:'$D(^TMP($J,"D",%)) S X=^(%) Q:X["LOCAL" S IO("IP")=$P($P(X,"REMOTE=",2),"@"),IO("PORT")=+$P($P(X,"LOCAL=",2),"@",2) S %=$P($ZTRNLNM("SSH_CLIENT")," ") S:%="" %=$ZTRNLNM("REMOTEHOST") S HLDP=$$IEN(IO("PORT")) ; D LISTEN^HLCSTCP Q ; ;Sample Linux script ;#!/bin/bash ;#HL7 Listener ;cd /home/vista/dev/ ;. ./gtmprofile ;#env > hl7log.txt ;$gtm_dist/mumps -r GTMLNX^HLCSGTM ;exit 0 ; ;Sample xinetd config file ;service hl7tcp ;{ ; socket_type = stream ; user = gtmuser ; wait = no ; disable = no ; server = /bin/bash ; server_args = -l /home/vista/dev/hl7tcp.sh ; passenv = REMOTE_HOST ;} XOBVGTM^INT^1^60871,40414^0 XOBVGTM ;ISF/RWF - Vistalink startup for GT.M v5 from xinetd ;8/29/07 11:13 ;;1.0;VISTALINK; GTMLNX ; -- Linux xinetd multi-thread entry point for GT.M ; NEW XOBEC DO ESET^XOBVTCP ; ; **GTM/linux specific code** SET (IO,IO(0))=$P,@("$ZT=""""") X "U IO:(nowrap:nodelimiter:IOERROR=""TRAP"")" ;Setup device S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)"""),X="" X "ZSHOW ""D"":TMP" F %=1:1 Q:'$D(TMP($J,"D",%)) S X=^(%) Q:X["LOCAL" S IO("IP")=$P($P(X,"REMOTE=",2),"@"),IO("PORT")=+$P($P(X,"LOCAL=",2),"@",2) ;End GT.M code ; SET XOBEC=$$NEWOK^XOBVTCPL() IF XOBEC DO LOGINERR^XOBVTCPL(XOBEC,IO) IF 'XOBEC DO COUNT^XUSCNT(1),SPAWN^XOBVLL,COUNT^XUSCNT(-1) QUIT ; ;Sample linux scripts ;xinetd script ;vvvvvvvvvvvvvvvvvvvvvvvvv ;service vistalink ;{ ; socket_type = stream ; port = 18001 ; type = UNLISTED ; user = vista ; wait = no ; disable = no ; server = /bin/bash ; server_args = /home/vista/dev/vistalink.sh ; passenv = REMOTE_HOST ;} ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;cat /home/vista/dev/vistalink.sh ;vvvvvvvvvvvvvvvvvvvvvvvvvvvv ;#!/bin/bash ;#RPC Broker ;cd /home/vista/dev ;. ./gtmprofile ;$gtm_dist/mumps -r GTMLNX^XOBVGTM ;exit 0 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **************************************************** XOBVGTM ;ISF/RWF - Vistalink startup for GT.M v5 from xinetd ;8/29/07 11:13 ;;1.0;VISTALINK; GTMLNX ; -- Linux xinetd multi-thread entry point for GT.M ; NEW XOBEC DO ESET^XOBVTCP ; ; **GTM/linux specific code** SET (IO,IO(0))=$P,@("$ZT=""""") X "U IO:(nowrap:nodelimiter:IOERROR=""TRAP"")" ;Setup device S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)"""),X="" X "ZSHOW ""D"":TMP" F %=1:1 Q:'$D(TMP($J,"D",%)) S X=^(%) Q:X["LOCAL" S IO("IP")=$P($P(X,"REMOTE=",2),"@"),IO("PORT")=+$P($P(X,"LOCAL=",2),"@",2) ;End GT.M code ; SET XOBEC=$$NEWOK^XOBVTCPL() IF XOBEC DO LOGINERR^XOBVTCPL(XOBEC,IO) IF 'XOBEC DO COUNT^XUSCNT(1),SPAWN^XOBVLL,COUNT^XUSCNT(-1) QUIT ; ;Sample linux scripts ;xinetd script ;vvvvvvvvvvvvvvvvvvvvvvvvv ;service vistalink ;{ ; socket_type = stream ; port = 18001 ; type = UNLISTED ; user = vista ; wait = no ; disable = no ; server = /bin/bash ; server_args = /home/vista/dev/vistalink.sh ; passenv = REMOTE_HOST ;} ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;cat /home/vista/dev/vistalink.sh ;vvvvvvvvvvvvvvvvvvvvvvvvvvvv ;#!/bin/bash ;#RPC Broker ;cd /home/vista/dev ;. ./gtmprofile ;$gtm_dist/mumps -r GTMLNX^XOBVGTM ;exit 0 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ******************************************************************************** XWBTCPM ;ISF/RWF - BROKER TCP/IP PROCESS HANDLER ;08/20/2007 ;;1.1;RPC BROKER;**35,43**;Mar 28, 1997 ;Based on: XWBTCPC & XWBTCPL, Modified by ISF/RWF ;Changed to be started by UCX or %ZISTCPS ; DSM ;DSM called from ucx, % passed in with device. D ESET ;Open the device S XWBTDEV=% X "O XWBTDEV:(TCPDEV):60" ;Special UCX/DSM open ;Go find the connection type U XWBTDEV G CONNTYPE ; CACHEVMS ;Cache'/VMS tcpip entry point, called from XWBTCP_START.COM file D ESET S XWBTDEV="SYS$NET" ; **Cache'/VMS specific code** O XWBTDEV::5 X "U XWBTDEV:(::""-M"")" ;Packet mode like DSM G CONNTYPE ; NT ;entry from ZISTCPS ;JOB LISTEN^%ZISTCPS("port","NT^XWBTCPM","stop code") D ESET S XWBTDEV=IO G CONNTYPE ; GTMUCX(%) ;From ucx ZFOO ;If called from LISTEN^%ZISTCP(PORT,"GTM^XWBTCPM") S XWBTDEV=IO D ESET ;GTM specific code S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") S XWBTDEV=% X "O %:(RECORDSIZE=512)" G CONNTYPE ; GTMLNX ;From Linux xinetd script D ESET ;GTM specific code S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""") S XWBTDEV=$P X "U XWBTDEV:(nowrap:nodelimiter:ioerror=""TRAP"")" S %="",@("%=$ZTRNLNM(""REMOTE_HOST"")") S:$L(%) IO("GTM-IP")=% G CONNTYPE ; ESET ;Set inital error trap S U="^",$ETRAP="D ^%ZTER H" ;Set up the error trap S X="",@^%ZOSF("TRAP") ;Clear old trap Q ;Find the type of connection and jump to the processing routine. CONNTYPE ; N XWBDEBUG,XWBAPVER,XWBCLMAN,XWBENVL,XWBLOG,XWBOS,XWBPTYPE N XWBTBUF,XWBTIP,XWBTSKT,XWBVER,XWBWRAP,XWBSHARE,XWBT N SOCK,TYPE D INIT S XWB=$$BREAD^XWBRW(5,XWBTIME) D LOG("MSG format is "_XWB_" type "_$S(XWB="[XWB]":"NEW",XWB="{XWB}":"OLD",XWB="0:^XTV(8989.3,1,4,X,0),1:"ROU^y^1") I $G(^%ZIS(14.5,"LOGON",XWBVOL)) Q 0 ;Check INHIBIT LOGONS? I $D(^%ZOSF("ACTJ")) X ^("ACTJ") I $P(J,U,3),($P(J,U,3)'>Y) Q 0 Q 1 ; M2M ;M2M Broker S XWBRBUF=XWB_XWBRBUF,(IO,IO(0))=XWBTDEV G SPAWN^XWBVLL Q ; NEW ;New broker S U="^",DUZ=0,DUZ(0)="",XWBVER=1.108 D SETTIME(1) ;Setup for sign-on timeout U XWBTDEV D . N XWB,ERR,NATIP,I . S ERR=$$PRSP^XWBPRS . S ERR=$$PRSM^XWBPRS . S MSG=$G(XWB(4,"CMD")) ;Build connect msg. . S I="" F S I=$O(XWB(5,"P",I)) Q:I="" S MSG=MSG_U_XWB(5,"P",I) . ;Get the peer and save that IP. . S NATIP=$$GETPEER^%ZOSV S:'$L(NATIP) NATIP=$P(MSG,"^",2) . I NATIP'=$P(MSG,"^",2) S $P(MSG,"^",2)=NATIP . Q S X=$$NEWJOB() D:'X LOG("No New Connects") I ($P(MSG,U)'="TCPConnect")!('X) D QSND^XWBRW("reject"),LOG("reject: "_MSG) Q D QSND^XWBRW("accept"),LOG("accept") ;Ack S IO("IP")=$P(MSG,U,2),XWBTSKT=$P(MSG,U,3),XWBCLMAN=$P(MSG,U,4) S XWBTIP=$G(IO("IP")) ;start RUM for Broker Handler XWB*1.1*5 D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,1) ;GTM I $G(XWBT("PCNT")) D . S X=$NA(^XUTL("XUSYS",$J,1)) L +@X:0 . D COUNT^XUSCNT(1),SETLOCK^XUSCNT(X) ;We don't use a callback K XWB,CON,LEN,MSG ;Clean up ;Attempt to share license, Must have TCP port open first. U XWBTDEV ;D SHARELIC^%ZOSV(1) ;setup null device "NULL" S %ZIS="0H",IOP="NULL" D ^%ZIS S XWBNULL=IO I POP S XWBERROR="No NULL device" D ^%ZTER,EXIT Q D SAVDEV^%ZISUTL("XWBNULL") ;change process name D CHPRN("ip"_$P(XWBTIP,".",3,4)_":"_XWBTDEV) ; RESTART ;The error trap returns to here N $ESTACK S $ETRAP="D ETRAP^XWBTCPM" S DT=$$DT^XLFDT,DTIME=30 U XWBTDEV D MAIN D LOG("Exit: "_XWBTBUF) ;Turn off the error trap for the exit S $ETRAP="" D EXIT ;Logout K XWBR,XWBARY ;stop RUM for handler XWB*1.1*5 D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,2) D USE^%ZISUTL("XWBNULL"),CLOSE^%ZISUTL("XWBNULL") ;Close in the calling script K SOCK,TYPE,XWBSND,XWBTYPE,XWBRBUF Q ; MAIN ; -- main message processing loop. debug at MAIN+1 F D Q:XWBTBUF="#BYE#" . ;Setup . S XWBAPVER=0,XWBTBUF="",XWBTCMD="",XWBRBUF="" . K XWBR,XWBARY,XWBPRT . ; -- read client request . S XR=$$BREAD^XWBRW(1,XWBTIME,1) . I '$L(XR) D LOG("Timeout: "_XWBTIME) S XWBTBUF="#BYE#" Q . S XR=XR_$$BREAD^XWBRW(4) . I XR="#BYE#" D Q ;Check for exit . . D QSND^XWBRW("#BYE#"),LOG("BYE CMD") S XWBTBUF="#BYE#" . . Q . S TYPE=(XR="[XWB]") ;check HDR . I 'TYPE D LOG("Bad Header: "_XR) Q . D CALLP^XWBPRS(.XWBR,$G(XWBDEBUG)) ;Read the NEW Msg parameters and call RPC . IF XWBTCMD="#BYE#" D Q . . D QSND^XWBRW("#BYE#"),LOG("BYE CMD") S XWBTBUF=XWBTCMD . . Q . U XWBTDEV . S XWBPTYPE=$S('$D(XWBPTYPE):1,XWBPTYPE<1:1,XWBPTYPE>6:1,1:XWBPTYPE) . ;I $G(XWBPRT) D RETURN^XWBPRS2 Q ;New msg return . I '$G(XWBPRT) D SND^XWBRW ;Return data,flush buffer Q ;End Of Main ; ; ETRAP ; -- on trapped error, send error info to client N XWBERC,XWBERR ;Change trapping during trap. S $ETRAP="D ^%ZTER,EXIT^XWBTCPM HALT" S XWBERC=$E($$EC^%ZOSV,1,200),XWBERR="M ERROR="_XWBERC_$C(13,10)_"LAST REF="_$$LGR^%ZOSV I $EC["U411" S XWBERROR="U411",XWBSEC="",XWBERR="Data Transfer Error to Server" D ^%ZTER ;%ZTER clears $ZE and $ZCODE D LOG("In ETRAP: "_XWBERC) ;Log I (XWBERC["READ")!(XWBERC["WRITE")!(XWBERC["SYSTEM-F")!(XWBERC["IOEOF") D EXIT HALT U XWBTDEV I $G(XWBT("PCNT")) L ^XUTL("XUSYS",$J,0) E L ;Clear Locks ;I XWBOS'="DSM" D S XWBPTYPE=1 ;So SNDERR won't check XWBR ;D SNDERR^XWBRW,WRITE^XWBRW($C(24)_XWBERR_$C(4)) D ESND^XWBRW($C(24)_XWBERR_$C(4)) S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" D CLEANP^XWBTCPM G RESTART^XWBTCPM",$ECODE=",U99," Q ; CLEANP ;Clean up the partion N XWBTDEV,XWBNULL D KILL^XUSCLEAN Q ; STYPE(X,WRAP) ;For backward compatability only I $D(WRAP) Q $$RTRNFMT^XWBLIB($G(X),WRAP) Q $$RTRNFMT^XWBLIB(X) ; BREAD(L,T) ;read tcp buffer, L is length Q $$BREAD^XWBRW(L,$G(T)) ; CHPRN(N) ;change process name ;Change process name to N D SETNM^%ZOSV($E(N,1,15)) Q ; SETTIME(%) ;Set the Read timeout 0=RPC, 1=sign-on S XWBTIME=$S($G(%):90,$G(XWBVER)>1.105:$$BAT^XUPARAM,1:36000),XWBTIME(1)=2 I $G(%) S XWBTIME=$S($G(XWBVER)>1.1:90,1:36000) Q TIMEOUT ;Do this on MAIN loop timeout I $G(DUZ)>0 D QSND^XWBRW("#BYE#") Q ;Sign-on timeout S XWBR(0)=0,XWBR(1)=1,XWBR(2)="",XWBR(3)="TIME-OUT",XWBPTYPE=2 D SND^XWBRW Q ; OS() ;Return the OS Q $S(^%ZOSF("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["OpenM":"OpenM",1:"MSM") ; INIT ;Setup S U="^",XWBTIME=10,XWBOS=$$OS,XWBDEBUG=0,XWBRBUF="" S XWBDEBUG=$$GET^XPAR("SYS","XWBDEBUG") S XWBT("BF")=$S(XWBOS="GT.M":"#",1:"!") S XWBT("PCNT")=0 I XWBOS="GT.M",$L($T(^XUSCNT)) S XWBT("PCNT")=1 D LOGSTART^XWBDLOG("XWBTCPM") Q ; DEBUG ;Entry point for debug, Build a server to get the connect ;DSM sample;ZDEBUG ON S $ZB(1)="SERV+1^XWBTCPM:1",$ZB="ETRAP+1^XWBTCPM:1" W !,"Before running this entry point set your debugger to stop at" W !,"the place you want to debug. Some spots to use:" W !,"'SERV+1^XWBTCPM', 'MAIN+1^XWBTCPM' or 'CAPI+1^XWBPRS.'",! W !,"or location of your choice.",! W !,"IP Socket to Listen on: " R SOCK:300 Q:'$T!(SOCK["^") ;Use %ZISTCP to do a single server D LISTEN^%ZISTCP(SOCK,"SERV^XWBTCPM") U $P W !,"Done" Q SERV ;Callback from the server S XWBTDEV=IO,XWBTIME(1)=3600 D INIT S XWBDEBUG=1,MSG=$$BREAD^XWBRW(5,60) ;R MSG#5 D NEW S IO("C")=1 ;Cause the Listenr to stop Q ; EXIT ;Close out I $G(DUZ) D LOGOUT^XUSRB I $G(XWBT("PCNT")) D COUNT^XUSCNT(-1) Q ; LOG(MSG) ;Record Debug Info D:$G(XWBDEBUG) LOG^XWBDLOG(MSG) Q ; ****************************************************************** # cat/etc/xinetd.d/HLCS5000 service HLCS5000 { port = 5000 socket_type = stream protocol = tcp user = wvehr1 server = /bin/bash server_args = -l /home/wvehr1/EHR/HLCS_Start passenv = REMOTE_HOST type = UNLISTED wait = no disable = no } ******************************************************************** # cat /home/wvehr1/EHR/HLCS_Start #!/bin/sh #This is to start HL7 Multilistener using xinetd cd /home/wvehr1/EHR/ #GTM profile #provided by env8 . /home/wvehr1/EHR/env8 date >> /home/wvehr1/EHR/HLCS_Start.log #Run routine mumps -run GTMLNX^HLCSGTM 2>>/home/wvehr1/EHR/HLCS_Start.log *************************************************************************** HL7 Mulitlistener Setup Server Side Setup done by Wally Fort on 9/4/07. He said it is not fussy about what user does the setup. GTM>D Q^DI VA FileMan 22.0 Your Identity(DUZ) is 0(zero). Please identify yourself. Access Code: Your Identity(DUZ) is still 0(zero). You need to identify yourself! New Person?: ANDERSON,ROBERT RA IRM RADIOLOGIST Select OPTION: ENTER OR EDIT FILE ENTRIES INPUT TO WHAT FILE: 870 HL LOGICAL LINK (222 entries) EDIT WHICH FIELD: ALL// Select HL LOGICAL LINK NODE: ? Answer with HL LOGICAL LINK NODE, or INSTITUTION, or MAILMAN DOMAIN, or DNS DOMAIN, or TCP/IP ADDRESS, or TCP/IP SERVICE TYPE, or IEN772 OutQ-Non-TCP, or IEN772 InQ-Non-TCP Do you want the entire 222-Entry HL LOGICAL LINK List? N (No) Select HL LOGICAL LINK NODE: WLDVISTA Are you adding 'WLDVISTA' as a new HL LOGICAL LINK (the 223RD)? No// Y (Yes) INSTITUTION: ? Select an institution that has not been associated with another link. Answer with INSTITUTION NAME, or STATUS, or STATION NUMBER, or OFFICIAL VA NAME, or CURRENT LOCATION, or CODING SYSTEM/ID PAIR, or NPI, or STATUS, or NAME (CHANGED FROM), or CODING SYSTEM Do you want the entire INSTITUTION List? Y (Yes) Choose from: AUSTIN 200 BVA/VBA SUPPORT OFFICE DC BVA/VBA-SO 397 OFFICE OF INFORMATION SRV CNTR 776 VISN 1 VISN VISN 10 VISN VISN 11 VISN VISN 12 VISN VISN 13 VISN VISN 14 VISN VISN 15 VISN VISN 16 VISN VISN 17 VISN VISN 18 VISN VISN 19 VISN VISN 2 VISN VISN 20 VISN VISN 21 VISN VISN 22 VISN VISN 23 VISN VISN 3 VISN VISN 4 VISN VISN 5 VISN VISN 6 VISN VISN 7 VISN VISN 8 VISN VISN 9 VISN VOE OFFICE INSTITUTION 100 INSTITUTION: VOE OFFICE INSTITUTION 100 MAILMAN DOMAIN: DNS DOMAIN: LLP TYPE: ?? Enter the LLP used for this logical link. LLP TYPE: ? Enter the LLP used for this logical link. Answer with HL LOWER LEVEL PROTOCOL TYPE NAME Choose from: HLLP MAILMAN TCP X3.28 LLP TYPE: TCP DEVICE TYPE: ? Not editable from any user option. See field description. Choose from: PC Persistent Client NC Non-Persistent Client SS Single-threaded Server MS Multi-threaded Server SH Serial HLLP SX Serial X3.28 MM MailMan DEVICE TYPE: MS Multi-threaded Server STATE: ? Not editable from any user option. See field description. STATE: AUTOSTART: IN QUEUE FRONT POINTER: IN QUEUE BACK POINTER: OUT QUEUE FRONT POINTER: OUT QUEUE BACK POINTER: TIME STARTED: TIME STOPPED: TASK NUMBER: SHUTDOWN LLP ?: SHUTDOWN OUTGOING HLO MESSAGES: GROSS COMMUNICATIONS ERROR: Select MESSAGE NUMBER: Select MESSAGE NUMBER: QUEUE SIZE: MAIL GROUP: HLLP DEVICE: RE-TRANSMISSION ATTEMPTS: EXCEED RE-TRANSMIT ACTION: CLOSE BEFORE RE-TRANSMISSION: BLOCK SIZE: READ TIMEOUT: ACK TIMEOUT: LLP START BLOCK: LLP END BLOCK: PROTOCOL ID VERSION: UNI-DIRECTIONAL WAIT: X3.28 DEVICE: MAXIMUM MESSAGE SIZE: MAXIMUM BLOCK SIZE: ^PORT?? MAXIMUM BLOCK SIZE: TIMER A: TIMER B: TIMER D: TIMER E: TCP/IP ADDRESS: TCP/IP PORT: 9255 TCP/IP SERVICE TYPE: ? Does this link send a connection request or receive connection requests? Choose from: C CLIENT (SENDER) S SINGLE LISTENER M MULTI LISTENER TCP/IP SERVICE TYPE: M MULTI LISTENER PERSISTENT: N NO RETENTION: STARTUP NODE: SAY HELO: TCP/IP PORT (OPTIMIZED): ^ Select HL LOGICAL LINK NODE: Select OPTION: GTM>D ^%G Output device: : List ^HLCS(870,"E","M",*) ^HLCS(870,"E","M",179)="" ^HLCS(870,"E","M",183)="" ^HLCS(870,"E","M",225)="" List ^HLCS(870,225,0) GT.M Mumps users on 04-Sep-07 20:10:35 Proc. id Proc. name PS Device Routine Mode CPU time -------- --------------- --- -------- -------- ------ 2177 S ? -direct 2224 Taskman EHR 1 S ? -direct 2230 BTask 1029 S ? -direct 2245 BTask 1030 S ? -direct 2254 Sub 2254 S ? -direct 2508 S+ pts/2 -di Total 6 users. GTM> ****************************************************************