[comp.os.vms] You are logged in 27 times !

xrjjm%scint.span@JPL-VLSI.ARPA.UUCP (06/03/87)

Well, if you are worried about how many times a user is logged in, one of the
best ways to check it is by calling the F$PID routine and seeing how many 
PID's are active for your account.  If more than one is active, then you
must have more than one session logged in (or a subprocess, or a batch job...
etc.)

Below is a program (written in DCL) which will list all of your current 
processes, what they are doing, and what terminal they are logged into.
The program requires no privileges, and VMS 4.4.  I threw in a Help file,
and the CHECKSUM numbers, just in case your mailer chews on source code.

As usual, this program is distributed "AS IS", and I hope you find it of
use.

John J. McMahon - Fast Eddie
XRJJM%CSDR.SPAN@VLSI.JPL.NASA.GOV
(FEDUP Software - Fast Eddie's Digital Utility Programs)

PS: If you don't have VMS 4.4, all you have to do is take the GOSUB's out of the
program and replace them with a GOTO construct.

------------CUT HERE---------------PID_CHECK.COM-------------------------------
$! PID_CHECK.COM - Check to see if a user is logged in multiple times.
$! Requires VMS 4.4 (Uses VMS GOSUB) and No Privileges (GROUP or WORLD will
$! make it act wierd).
$!
$! John J. McMahon, F.E.D.U.P. Software
$! XRJJM%CSDR.SPAN@VLSI.JPL.NASA.GOV
$!
$ Write Sys$output "Executing PID_CHECK.COM"
$ curpriv = F$GETJPI("","CURPRIV")
$ SET PROCESS/PRIV=(NOGROUP,NOWORLD)
$ Context = ""
$ Count = 0
$ Loop:
$ Xyzzy = F$PID(Context)
$ If Xyzzy .nes. "" then Count = Count + 1
$ If Xyzzy .nes. "" then Goto Loop
$ Write Sys$Output "You Are Currently Logged Into ",Count," Sessions."
$ If Count .Ne. 1 then gosub uhoh
$ set process/priv=('curpriv')
$ Exit
$ uhoh:
$ Write Sys$output "WARNING: Multiple Sessions!"
$ curpid = F$GETJPI("","PID")
$ loop:
$ xyzzy = f$pid(context)
$ if xyzzy .eqs. curpid then write sys$output -
     xyzzy," ",F$GetJpi(xyzzy,"PRCNAM")
$ if xyzzy .eqs. curpid then write sys$output "  Current Process"
$ if xyzzy .nes. curpid then gosub noncurpid
$ if xyzzy .nes. "" then goto loop
$ exit
$ noncurpid:
$ comment = ""
$ if xyzzy .eqs. "" then return
$ imagename = F$Getjpi(xyzzy,"IMAGNAME")
$ imagename = F$PARSE(imagename,,,"NAME")
$ if imagename .eqs. "" then imagename = "$ DCL"
$ terminal = F$GetJpi(xyzzy,"TERMINAL")
$ if terminal .eqs. "" then terminal = "None"
$ Mode = F$GetJpi(xyzzy,"MODE")
$ If xyzzy .nes. F$GetJpi(xyzzy,"MASTER_PID") then gosub subproc
$ write sys$output xyzzy," ",F$getjpi(xyzzy,"PRCNAM")
$ write sys$output "  Image: ",imagename," Term: ",-
  TERMINAL," State: ",F$GetJpi(xyzzy,"STATE"),-
  " Mode: ", MODE," ",COMMENT
$ return
$ subproc:
$ XPID1 = F$GetJpi(xyzzy,"MASTER_PID") 
$ Mode = "SUBPROC/"+F$EXTRACT(0,5,F$GETJPI(XPID1,"MODE"))
$ If XPID1 .eqs. curpid then comment = "(*)"
$ If XPID1 .nes. curpid then comment = "("+F$GETJPI(XPID1,"PRCNAM")+")"
$ return
--------------------End Of File-------------Cut Here-----------------------
Note: PID_CHECK.COM has a Checksum Value Of 607410262 under VMS 4.4

----------------Cut Here----------------PID_CHECK.HLP----------------------
1 PID_CHECK

PID_CHECK (Short for Process IDentification number CHECK) is a command 
procedure designed to determine how many times you are logged on a 
given CPU, and what the other processes are doing.  PID_CHECK will count 
the number of active processes, and issue a warning if more than one 
process is active.  It will also detail what the other processes are
currently doing.

To Execute PID_CHECK:

   $ @$1$22:[XRJJM.COMMAND]PID_CHECK

2 Output_Format

If yours is the only process logged on a node, PID_CHECK will report:

"You Are Currently Logged Into 1 Sessions."

If you have two or more processes on a node, PID_CHECK will follow the
"You Are..." message with details on each process.  The details are in
the following format:

For the current process:

    NNNNNNNN PRCNAM                   
      Current Process






For other processes:

    NNNNNNNN PRCNAM
      Image: IMAGNAME Term: TERMINAL State: STAT Mode: MDE EXTRA

NNNNNNNN refers to the Process ID number, which is unique for each process.
PRCNAM is the Process Name.
IMAGNAME is the image currently running.  If the user has a DCL prompt, 
                or is running a command procedure, IMAGNAME = "$ DCL".
TERMINAL is the Terminal Name.
STAT is the current process state (COM = Compute, LEF = Local Event Flag 
                                  Wait, HIB = Hibernate, etc.)
MDE is the type of Login (NETWORK, INTERACTIVE, BATCH, OTHER), Subprocess 
                         Logins will be of the form SUBPROC/MDE, where MDE
                         is the mode of the master process.
EXTRA contains the Process Name of the master of a subprocess, if it's your 
                         process the name will be (*).

2 Examples

Sample Output from a user who has 6 active processes on one node.

Executing Login$:PID_CHECK.COM
You Are Currently Logged Into 6 Sessions.
WARNING: Multiple Sessions!
24E002AD Fast-Eddie~AD
  Current Process
24E003B1 Batch-Eddie~B1
  Image: MMS Term: None State: LEF Mode: BATCH 
24E003B2 XRJJM_1
  Image: DBDEF Term: None State: COM Mode: SUBPROC/BATCH (Batch-Eddie~B1)
24E003B6 NET_6194
  Image: $ DCL Term: None State: LEF Mode: NETWORK 
24E003B7 XRJJM_2
  Image: $ DCL Term: None State: LEF Mode: SUBPROC/INTER (*)
24E003B8 XRJJM
  Image: $ DCL Term: LTA49: State: LEF Mode: INTERACTIVE 

Sample Output from a user who has only 1 process on the node.

Executing Login$:PID_CHECK.COM
You Are Currently Logged Into 1 Sessions.
------------End Of File---------------------Cut Here-------------------------
Note: PID_CHECK.HLP has a CHECKSUM of 2081195890 under VMS 4.4

End Of Mail.