Kathleen,
Another approach for you. These examples work for AIX, so the find command used would need to be modified for Linux to use -inum and not -i. This routine runs the LIST.READU DETAIL command and gives you the option to select an individual lock you are interested in, obviously this will be slow as it searchs it real time.
PROGRAM JDS.LIST.READU
EXECUTE 'LIST.READU DETAIL' CAPTURING OUTPUT
IF OUTPUT<2> = "No locks or semaphores active." THEN
CRT
CRT OUTPUT<2>
CRT
STOP
END
NOL = DCOUNT(OUTPUT,@AM)
GOSUB L100.DISPLAY.LOCKS
EXIT.PROG = 0
LOOP
CRT "Enter the lock number to display the file " :
INPUT LOCK.NO
LOCK.NO = UPCASE(LOCK.NO)
IF LOCK.NO = "E" OR LOCK.NO = "Q" OR LOCK.NO = "X" OR LOCK.NO = "" THEN EXIT.PROG = 1
UNTIL EXIT.PROG DO
BEGIN CASE
CASE LOCK.NO = "R"
GOSUB L100.DISPLAY.LOCKS
CASE NOT(NUM(LOCK.NO))
CRT "Input a lock number, R to Refresh or E,Q,X or '' to Exit"
CASE LOCK.NO LE 0
CRT "No such lock"
CASE LOCK.ARRAY<LOCK.NO> = ""
CRT "No such lock"
CASE 1
CRT "Checking Please Wait"
DEVNO = LOCK.ARRAY<LOCK.NO,1>
INO = LOCK.ARRAY<LOCK.NO,2>
ERROR = 0
ERROR.MESS = ""
FILENAME = ""
CALL DEVNO.INO(DEVNO,INO,ERROR,ERROR.MESS,FILENAME)
IF ERROR THEN
CRT "Checking returned the following error(s)"
ERR.CNT = DCOUNT(ERROR.MESS<1>,@VM)
FOR ERR.NXT = 1 TO ERR.CNT
CRT ERROR.MESS<1,ERR.NXT>
NEXT ERR.NXT
END ELSE
CRT "Filename = " : FILENAME
END
END CASE
REPEAT
STOP
L100.DISPLAY.LOCKS:
CRT OUTPUT<1>
CRT OUTPUT<2>
CRT OUTPUT<3>
CNTR = 0
CNTR = 0
LOCK.ARRAY = ""
FOR LN.NXT = 4 TO NOL
IF OUTPUT<LN.NXT> NE "" THEN
CNTR += 1
CRT OUTPUT<LN.NXT> : " (Lock " : CNTR "R#5" : ")"
OLINE = TRIM(OUTPUT<LN.NXT>)
LOCK.ARRAY<CNTR,1> = FIELD(OLINE," ",1)
LOCK.ARRAY<CNTR,2> = FIELD(OLINE," ",2)
END
NEXT LN.NXT
CRT
RETURN
END
It calls the following program to map the dno , ino
SUBROUTINE DEVNO.INO(DEVNO,INO,ERROR,ERROR.MESS,FILENAME)
ERROR = 0
ERROR.MESS = ""
FILENAME = ""
IF DEVNO = "" OR INO = "" THEN
ERROR = 1
ERROR.MESS<1,-1> = "Device or Ino not supplied"
RETURN
END
IF NOT(NUM(DEVNO)) THEN
ERROR = 1
ERROR.MESS<1,-1> = "Invalid Devno"
RETURN
END
IF NOT(NUM(INO)) THEN
ERROR = 1
ERROR.MESS<1,-1> = "Invalid Inode"
END
EXECUTE 'STATUS DISKS' CAPTURING OUTPUT
NOL = DCOUNT(OUTPUT,@AM)
FDEV = 0
FOR LN.NXT = 2 TO NOL WHILE NOT(FDEV)
LINE = TRIM(OUTPUT<LN.NXT>)
IF LINE = "" THEN CONTINUE
MPOINT = FIELD(LINE," ",7)
OPENPATH MPOINT TO F.MPOINT THEN
STATUS MPOINT.STATUS FROM F.MPOINT THEN
IF MPOINT.STATUS<11> = DEVNO THEN
* Found Device
FMPOINT = MPOINT
FDEV = 1
END
END ELSE
ERROR = 1
ERROR.MESS<1,-1> = "Unable to get information on mount point " : MPOINT
END
END ELSE
ERROR = 1
ERROR.MESS<1,-1> = "Unable to open path to " : MPOINT
END
CLOSE F.MPOINT
NEXT LN.NXT
IF FDEV THEN
EXEC.STMT = "cd " : FMPOINT : " ; find . -inum " : INO
EXECUTE 'sh -c ' : SQUOTE(EXEC.STMT) CAPTURING OUTPUT
IF OUTPUT<1> NE "" THEN
ERROR = 0
ERROR.MESS = ""
FILENAME = OUTPUT<1>
END ELSE
ERROR = 1
ERROR.MESS<1,-1> = "Unable to locate file via Dno / Ino"
END
END ELSE
ERROR = 1
ERROR.MESS<1,-1> = "Unable to find Dno in mount points"
END
RETURN
END
From TCL>
RUN BP JDS.LIST.READU
Active Record Locks:
Device.............. Inode.............. Netnode Userno Lmode Pid Login Id Item-ID.............
9223372200063533058 51195 0 111 37 RU 24838220 root DUMMY (Lock 1)
9223372200063533058 51144 0 111 37 RU 24838220 root DUMMY (Lock 2)
9223372200063533058 51195 0 111 81 RU 24838220 root LOGIN (Lock 3)
Enter the lock number to display the file 3
Checking Please Wait
Filename = ./accounts/uv/jds/VOC
Enter the lock number to display the file E
Now if wanted to take this a step further and prebuild a file with all the devno / ino combinations, you can use the following the program to open each file in an account, get it's dno and ino and map it into a look up file, similar to the other example but without the the overhead of running account file stats. This program takes only a few seconds to run in an account.
OPEN "DNO.INO.LOG" TO F.LOGFILE ELSE
CRT "CANNOT OPEN DNO.INO.LOG"
STOP
END
EXECUTE 'SELECT VOC'
LOOP WHILE READNEXT K.VOC DO
OPEN "DATA",K.VOC TO F.FILE THEN
GOSUB L100.LOG.DNO.INO
CLOSE F.FILE
END
OPEN "DICT",K.VOC TO F.FILE THEN
GOSUB L100.LOG.DNO.INO
CLOSE F.FILE
END
REPEAT
STOP
L100.LOG.DNO.INO:
FILEPATH = FILEINFO(F.FILE,2)
STATUS FILESTATUS FROM F.FILE THEN
DNO = FILESTATUS<10>
INO = FILESTATUS<11>
K.LOGFILE = DNO : "." : INO
R.LOGFILE = FILEPATH
WRITE R.LOGFILE ON F.LOGFILE,K.LOGFILE
END
RETURN
END
You could then use this program to do your LIST.READU
PROGRAM JDS.LIST.READU2
OPEN "DNO.INO.LOG" TO F.DNO.INO.LOG ELSE
CRT "CANNOT OPEN DNO.INO.LOG"
STOP
END
EXECUTE 'LIST.READU DETAIL' CAPTURING OUTPUT
IF OUTPUT<2> = "No locks or semaphores active." THEN
CRT
CRT OUTPUT<2>
CRT
STOP
END
NOL = DCOUNT(OUTPUT,@AM)
CRT OUTPUT<1>
CRT OUTPUT<2>
CRT OUTPUT<3>
CNTR = 0
CNTR = 0
LOCK.ARRAY = ""
FOR LN.NXT = 4 TO NOL
IF OUTPUT<LN.NXT> NE "" THEN
OLINE = TRIM(OUTPUT<LN.NXT>)
DNO = FIELD(OLINE," ",1)
INO = FIELD(OLINE," ",2)
READ R.DNO.INO.LOG FROM F.DNO.INO.LOG,INO:".":DNO THEN
CRT R.DNO.INO.LOG<1> "L#40" : OUTPUT<LN.NXT>[41,999]
END ELSE
CRT OUTPUT<LN.NXT>
END
END
NEXT LN.NXT
CRT
END
Final comment ... if you RESIZE a file the inode will change or if you move it around at the OS level it is also likely to change.
Hope these provide a simple, fast workaround for those of you not at UV 12 yet.
so from TCL
>LIST.READU DETAIL
Active Record Locks:
Device.............. Inode.............. Netnode Userno Lmode Pid Login Id Item-ID.............
9223372200063533058 51195 0 111 81 RU 24838220 root LOGIN
>RUN BP JDS.LIST.READU2
Active Record Locks:
Device.............. Inode.............. Netnode Userno Lmode Pid Login Id Item-ID.............
/disk2/accounts/uv/jds/VOC 0 111 81 RU 24838220 root LOGIN
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
Original Message:
Sent: 02-07-2023 14:27
From: Kathleen Hambrick
Subject: LIST.READU
Being used to the Unidata format, when running this command in Universe the file the lock is in does not display. We have common keys across many files so the format of this tool is very unhelpful to us! Does anyone have the syntax, alternate command, or custom ditty that shows all the pertinent info for a lock at one time? IE login, date/time, file, ID, process ID, User ID?
Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------