Fussion Middleware Forms Server Session Monitor On https://docs.oracle.com/cd/E15523_01/web.1111/e10240/configure.htm#FSDEP591 Figure 4-5 User Sessions page in Enterprise Manager shows the IP address and other information of the Oracle Forms client sessions. Here we'll get the same information from a script that runs on command line, so that you can build it into your monitoring program and schedule a cron job. This information is provided by Oracle WebLogic Scripting Tool or WLST according to How to get information about Forms Sessions Using a WLST Script ? (Doc ID 1580517.1) But the script provided in the note outputs too many unnecessary messages and presents the client information in a format unsuitable to read. The following is my modified version. If you need to debug, launch wlst.sh manually without passing this script as its argument so you're in the interactive mode and can type the commands one at a time. Documentation for WLST is at https://docs.oracle.com/cd/E24329_01/web.1211/e24491/toc.htm Basic Python programming skills are needed. $ pwd /u01/app/oracle/scripts/ck_frmsess $ cat ck_frmsess.py #!/usr/bin/python #ck_frmsess.py: Check Forms client sessions on Fusion Middleware Application Server #Based on script in "How to get information about Forms Sessions Using a WLST Script ? (Doc ID 1580517.1)" #chmod 600 ck_frmsess.py due to password #Usage: $MW_HOME/oracle_common/common/bin/wlst.sh ck_frmsess.py import sys import re import os import time as systime hn = 'myhostname.example.com' #os module not working, maybe WL hijacked it: hn=os.uname()[1] log = '/u01/app/oracle/scripts/ck_frmsess/ck_frmsess.log' passwd = 'weblogicpassword' redirect('/dev/null', 'false') connect('weblogic', passwd, url='t3://' + hn + ':9001') custom() cd ('oracle.dms') children = ls() childList = children.split("\n"); f = open(log, 'a') f.write("\n" + systime.strftime("%Y-%m-%d %H:%M:%S") + "\n") f.write("Config\tDBName\tDBSessID\tIP\tPID\tUser\n") print "Config\tDBName\tDBSessID\tIP\tPID\tUser" #for debug for child in childList: childInfo = child.split(' '); length = len(childInfo); if (len(childInfo) > 2 and re.match('oracle.dms:type=FormsRuntimeInfo,name=/frmDMS/\d',childInfo[3])): cd(childInfo[3]); attrs = ls(); attrList = attrs.split("\n"); for attr in attrList: #add/remove attributes as you wish if (attr.find("config_value") != -1 or attr.find("dbname_value") != -1 or attr.find("dbsessid_value") != -1 or attr.find("ip_value") != -1 or attr.find("pid_value") != -1 or attr.find("user_value") != -1): #This construct only works in slightly newer Python: vl = (attr.split()[2]+'\t' if True else '\t') try: #have to handle the case attr value is null, e.g. frmweb lingers after DB session is gone vl = attr.split()[2]+'\t' except IndexError: vl = '\t' f.write(vl) sys.stdout.write(vl) #for debug f.write("\n") print #for debug cd ('..') f.close() The output is like: $ cat ck_frmsess.log #App names, DB names and end users' names are changed to protect the innocent 2015-02-06 13:50:12 Config DBName DBSessID IP PID User acctadm orclp 431 10.119.54.6 10224 scott cpc orcld 2290 10.109.19.238 1065 adam budget orcld 2406 10.109.45.52 12560 mary belcore 10.105.130.49 6082 acctadm orclp 2682 10.119.55.167 15315 scott acctadm orclp 1682 10.119.53.76 17698 scott dataapp orcld 2909 10.109.37.183 18468 david where Config is the config name for an application DBName is database connect identifier DBSessID is SID of the database session (v$session.sid) IP is the end user's desktop IP PID is the frmweb PID on the app server or database v$session.process User is the database user (v$session.username) Occasionally some fields are null, probably because the database session has exited but frmweb process lingers around for a while. You may schedule a cron job to run the script and rotate the logs. Mine is */5 * * * * /u01/app/oracle/middleware/oracle_common/common/bin/wlst.sh /u01/app/oracle/scripts/ck_frmsess/ck_frmsess.py > /tmp/ck_frmsess.out 2>&1 58 23 * * * /bin/mv /u01/app/oracle/scripts/ck_frmsess/ck_frmsess.log /u01/app/oracle/scripts/ck_frmsess/ck_frmsess.log.$(/bin/date +'\%d') > /tmp/rotatefrmsesslog.out 2>&1