Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
------------------------------
Mike Bojaczko
PROGRAMMER ANALYST
US
------------------------------
Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
This will not help you at the moment but starting at UniVerse 12 it apdopts the same lock structure and methodolgy as UniData.
So at UniVerse 12 the output of LIST.READU is
>LIST.READU
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 977405710 C:\\u2\\UV\\ 2 14840 Jonatha LOGIN X Feb 8 09:39:01
>LIST.READU DETAIL
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 281474977405710 C:\\u2\\UV\\HS.SALES\\VOC 2 14840 Jonathan LOGIN X Wed Fe
b 8 09:39:01 2023
>LIST.READU EVERY
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 977405710 C:\\u2\\UV\\ 2 14840 Jonatha LOGIN X Feb 8 09:39:01
>LIST.READU EVERY DETAIL
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 281474977405710 C:\\u2\\UV\\HS.SALES\\VOC 2 14840 Jonathan LOGIN X Wed Fe
b 8 09:39:01 2023
You also have the option in UniVerse to add the word INTERNAL to get the information back in an array for processing in your own programs.
>LIST.READU DETAIL INTERNAL
2016955433ý281474977405710ýC:\\u2\\UV\\HS.SALES\\VOCý2ý14840ýJonathanýLOGINýXýWed Fe
b 8 09:39:01 2023
Also the uvglm_tool and uvulc_tool has been added to match the glm_tool and ulc_tool utlities in UniData.
Prior to 12 you can use the following methods.
>LIST.READU
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
5768565761 176284 0 111 91 RU 21954800 root LOGIN
You can search for the inode using find with the '-i' option, the example works quickly as the file is in the current directory.
>sh -c "find . -i 176284"
./VOC
You can also search the whole machine for files with matching inodes, this could take some time :-)
>sh -c "cd / ; find . -i 176284 -print"
./disk1/uv1132/HS.SALES/VOC
./proc/21954800/fd/5
./proc/21954800/fd/10
./proc/21954800/fd/12
UniVerse uses an internal method to calculate the device number it uses, I currently don't have a program that will work on all platforms to display which path maps to the device number, which you would need to shorten the method above and not having to search from root.
The above methods work for UNIX, Windows is different again.
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
Hi Kathleen,
We have from within SB Client, we run Universe on Windows, a utility that provides this
------------------------------
Andrew Milne
Business Systems Manager
Potter and Moore Innovations
Peterborough, Cambs GB
------------------------------
This will not help you at the moment but starting at UniVerse 12 it apdopts the same lock structure and methodolgy as UniData.
So at UniVerse 12 the output of LIST.READU is
>LIST.READU
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 977405710 C:\\u2\\UV\\ 2 14840 Jonatha LOGIN X Feb 8 09:39:01
>LIST.READU DETAIL
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 281474977405710 C:\\u2\\UV\\HS.SALES\\VOC 2 14840 Jonathan LOGIN X Wed Fe
b 8 09:39:01 2023
>LIST.READU EVERY
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 977405710 C:\\u2\\UV\\ 2 14840 Jonatha LOGIN X Feb 8 09:39:01
>LIST.READU EVERY DETAIL
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 281474977405710 C:\\u2\\UV\\HS.SALES\\VOC 2 14840 Jonathan LOGIN X Wed Fe
b 8 09:39:01 2023
You also have the option in UniVerse to add the word INTERNAL to get the information back in an array for processing in your own programs.
>LIST.READU DETAIL INTERNAL
2016955433ý281474977405710ýC:\\u2\\UV\\HS.SALES\\VOCý2ý14840ýJonathanýLOGINýXýWed Fe
b 8 09:39:01 2023
Also the uvglm_tool and uvulc_tool has been added to match the glm_tool and ulc_tool utlities in UniData.
Prior to 12 you can use the following methods.
>LIST.READU
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
5768565761 176284 0 111 91 RU 21954800 root LOGIN
You can search for the inode using find with the '-i' option, the example works quickly as the file is in the current directory.
>sh -c "find . -i 176284"
./VOC
You can also search the whole machine for files with matching inodes, this could take some time :-)
>sh -c "cd / ; find . -i 176284 -print"
./disk1/uv1132/HS.SALES/VOC
./proc/21954800/fd/5
./proc/21954800/fd/10
./proc/21954800/fd/12
UniVerse uses an internal method to calculate the device number it uses, I currently don't have a program that will work on all platforms to display which path maps to the device number, which you would need to shorten the method above and not having to search from root.
The above methods work for UNIX, Windows is different again.
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
01 list.readu
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
64770 19132140 0 95 169 RU 993343 kathleen BTIC100
64770 19132140 0 95 169 RU 993343 kathleen FINISH.TICKET.1
[root@ibm uv]# find . -inum 19132140
[root@ibm uv]#
ideas?
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
01 list.readu
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
64770 19132140 0 95 169 RU 993343 kathleen BTIC100
64770 19132140 0 95 169 RU 993343 kathleen FINISH.TICKET.1
[root@ibm uv]# find . -inum 19132140
[root@ibm uv]#
ideas?
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
What OS are you using
Also try doing LIST.READU INTERNAL to check to see if the LIST.READU output is being truncated.
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
What OS are you using
Also try doing LIST.READU INTERNAL to check to see if the LIST.READU output is being truncated.
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
CPE OS Name: cpe:/o:redhat:enterprise_linux:8::baseos
Kernel: Linux 4.18.0-425.10.1.el8_7.x86_64
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
CPE OS Name: cpe:/o:redhat:enterprise_linux:8::baseos
Kernel: Linux 4.18.0-425.10.1.el8_7.x86_64
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
------------------------------
Neil Morris
Universe Advanced Technical Support
Rocket Software
------------------------------
CPE OS Name: cpe:/o:redhat:enterprise_linux:8::baseos
Kernel: Linux 4.18.0-425.10.1.el8_7.x86_64
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
I tested on one of our redhat systems and the -inum with find works (see below). Maybe you need to drop a line to your Linux Admin to see why it is not working.
>LIST.READU
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
2058 784223 0 2 5 RU 25251 root TIME
2058 1045519 0 1 88 RU 25168 root LOGIN
>sh -c "find . -inum 1045519"
./VOC
>sh -c "uname -a"
Linux dentrp 2.6.32-504.el6.x86_64 #1 SMP Tue Sep 16 01:56:35 EDT 2014 x86_64 x8
6_64 x86_64 GNU/Linux
>sh -c "uv -version"
UniVerse 11.3.1
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
CPE OS Name: cpe:/o:redhat:enterprise_linux:8::baseos
Kernel: Linux 4.18.0-425.10.1.el8_7.x86_64
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
I just thought you may not get a result if the file doesn't exist in the current directory with 'find .' as it only works from the current directory down. If you want to search from the root file system down (as in my first response), it may take a while but try
sh -c 'cd / ; find . -inum nnnnnnn'
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
I tested on one of our redhat systems and the -inum with find works (see below). Maybe you need to drop a line to your Linux Admin to see why it is not working.
>LIST.READU
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
2058 784223 0 2 5 RU 25251 root TIME
2058 1045519 0 1 88 RU 25168 root LOGIN
>sh -c "find . -inum 1045519"
./VOC
>sh -c "uname -a"
Linux dentrp 2.6.32-504.el6.x86_64 #1 SMP Tue Sep 16 01:56:35 EDT 2014 x86_64 x8
6_64 x86_64 GNU/Linux
>sh -c "uv -version"
UniVerse 11.3.1
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
This will not help you at the moment but starting at UniVerse 12 it apdopts the same lock structure and methodolgy as UniData.
So at UniVerse 12 the output of LIST.READU is
>LIST.READU
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 977405710 C:\\u2\\UV\\ 2 14840 Jonatha LOGIN X Feb 8 09:39:01
>LIST.READU DETAIL
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 281474977405710 C:\\u2\\UV\\HS.SALES\\VOC 2 14840 Jonathan LOGIN X Wed Fe
b 8 09:39:01 2023
>LIST.READU EVERY
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 977405710 C:\\u2\\UV\\ 2 14840 Jonatha LOGIN X Feb 8 09:39:01
>LIST.READU EVERY DETAIL
Active Locks:
Device.... Inode.... FileName. UsrNo Pid.... LoginId ItemId... M LockTime.......
2016955433 281474977405710 C:\\u2\\UV\\HS.SALES\\VOC 2 14840 Jonathan LOGIN X Wed Fe
b 8 09:39:01 2023
You also have the option in UniVerse to add the word INTERNAL to get the information back in an array for processing in your own programs.
>LIST.READU DETAIL INTERNAL
2016955433ý281474977405710ýC:\\u2\\UV\\HS.SALES\\VOCý2ý14840ýJonathanýLOGINýXýWed Fe
b 8 09:39:01 2023
Also the uvglm_tool and uvulc_tool has been added to match the glm_tool and ulc_tool utlities in UniData.
Prior to 12 you can use the following methods.
>LIST.READU
Active Record Locks:
Device.... Inode.... Netnode Userno Lmode Pid Login Id Item-ID........
.....
5768565761 176284 0 111 91 RU 21954800 root LOGIN
You can search for the inode using find with the '-i' option, the example works quickly as the file is in the current directory.
>sh -c "find . -i 176284"
./VOC
You can also search the whole machine for files with matching inodes, this could take some time :-)
>sh -c "cd / ; find . -i 176284 -print"
./disk1/uv1132/HS.SALES/VOC
./proc/21954800/fd/5
./proc/21954800/fd/10
./proc/21954800/fd/12
UniVerse uses an internal method to calculate the device number it uses, I currently don't have a program that will work on all platforms to display which path maps to the device number, which you would need to shorten the method above and not having to search from root.
The above methods work for UNIX, Windows is different again.
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------
This is one of the main things I fix on each system on which I work
I've been doing that for about twenty years, meanwhile the experts at Rocket don't seem to get *it* and have never created a tool to do this.
If you have a system that regularly has twenty to ninety locks, you don't want to have to run the "find" on *every* *single* *line* of the output, it would take a half hour when you need to know the answer right now.
You can tell this pisses me off :)
At any rate.
I run a batch process every week to create an inode-xref file, logging through each and every account in the system
and then i rewrite the LIST.READU to use my xref file to display the actual file name
As has been mentioned you need to be at root when you do the find
That doesn't even always work since you have can remote files since Unix is so nice to users in the first place....
------------------------------
Will Johnson
Systems Analyst
Rocket Forum Shared Account
------------------------------
Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
Hi Kathleen,
1/ On each account, run ACCOUNT.FILE.STATS ALL it'll populate the uv/STAT.FILE file. (read docs about it)
build a q-ptr to it SET.FILE UV STAT.FILE UNIVERSE.STAT.FILE then you can LIST UNIVERSE.STAT.FILE FILENAME.LONG FILEINODE FILEDEV INODE.DEV
I suggest you index INODE.DEV
CREATE.INDEX UNIVERSE.STAT.FILE INODE.DEV NO,NULLS
BUILD.INDEX UNIVERSE.STAT.FILE ALL
2/ build a basic which capture LIST.READU EVERY DETAIL INTERNAL
execute 'LIST.READU EVERY DETAIL INTERNAL' capturing LRU
open 'UNIVERSE.STAT.FILE' to f.stat.file else ...
for x = 1 to dcount(LRU,@am)
* LRU<x,1> is DEVICE
* LRU<x,2> is INODE
r.stat.file=''
selectindex 'INODE.DEV', LRU<x,1>:'.':LRU<x,2> from F.STAT.FILE to s
if status() then
* not found ... use OS calls
end else
readnext k.stat.file from s
read r.stat.file from f.stat.file,k.stat.file then
* check dict stat.file .. 1==filename, 2 == filepath, ...
end
end
* show result
print convert(@vm,char(9),LRU<x>):' ':r.stat.file<1>
next x
If the inode is not found, use OS call to define filename/filepath
on unix
find `df -i | while read fs inodes iused ifree iuse mounted; do if [[ ${mounted::1} == '/' ]]; then stat --printf %d:%n $mounted ;echo ; fi; done | grep " : DEVICE : " | cut -d ':' -f2` -inum " : INODE : " 2>/dev/nullexecute 'dos /c "fsutil volume list"' capturing volumes
loop
remote volume from volumes setting eov
execute 'DOS /C "fsutil file queryfilenamebyid ' : volume[1, 2] : ' ' : INODE"' capturing CAP
NBZ = len(CAP)
for Z = NBZ to 1 step -1
if CAP[Z, 2] = volume[1,2] then FILEPATH = trim(CAP[Z, 999])<1> ; exit
next Z
while eov and FILEPATH = '' do repeat
userinfo(1,LRU<x,7>,U) or userinfo(2,LRU<x,4>,U) ... cf
UNIVERSE.INCLUDEUSERINFO.H ------------------------------
manu fernandes
------------------------------
Hi Kathleen,
1/ On each account, run ACCOUNT.FILE.STATS ALL it'll populate the uv/STAT.FILE file. (read docs about it)
build a q-ptr to it SET.FILE UV STAT.FILE UNIVERSE.STAT.FILE then you can LIST UNIVERSE.STAT.FILE FILENAME.LONG FILEINODE FILEDEV INODE.DEV
I suggest you index INODE.DEV
CREATE.INDEX UNIVERSE.STAT.FILE INODE.DEV NO,NULLS
BUILD.INDEX UNIVERSE.STAT.FILE ALL
2/ build a basic which capture LIST.READU EVERY DETAIL INTERNAL
execute 'LIST.READU EVERY DETAIL INTERNAL' capturing LRU
open 'UNIVERSE.STAT.FILE' to f.stat.file else ...
for x = 1 to dcount(LRU,@am)
* LRU<x,1> is DEVICE
* LRU<x,2> is INODE
r.stat.file=''
selectindex 'INODE.DEV', LRU<x,1>:'.':LRU<x,2> from F.STAT.FILE to s
if status() then
* not found ... use OS calls
end else
readnext k.stat.file from s
read r.stat.file from f.stat.file,k.stat.file then
* check dict stat.file .. 1==filename, 2 == filepath, ...
end
end
* show result
print convert(@vm,char(9),LRU<x>):' ':r.stat.file<1>
next x
If the inode is not found, use OS call to define filename/filepath
on unix
find `df -i | while read fs inodes iused ifree iuse mounted; do if [[ ${mounted::1} == '/' ]]; then stat --printf %d:%n $mounted ;echo ; fi; done | grep " : DEVICE : " | cut -d ':' -f2` -inum " : INODE : " 2>/dev/nullexecute 'dos /c "fsutil volume list"' capturing volumes
loop
remote volume from volumes setting eov
execute 'DOS /C "fsutil file queryfilenamebyid ' : volume[1, 2] : ' ' : INODE"' capturing CAP
NBZ = len(CAP)
for Z = NBZ to 1 step -1
if CAP[Z, 2] = volume[1,2] then FILEPATH = trim(CAP[Z, 999])<1> ; exit
next Z
while eov and FILEPATH = '' do repeat
userinfo(1,LRU<x,7>,U) or userinfo(2,LRU<x,4>,U) ... cf
UNIVERSE.INCLUDEUSERINFO.H ------------------------------
manu fernandes
------------------------------
Hi Manu - thanks for this detail - I did not know about the ACCOUNT.FILE.STATS so that was very helpful! But we have MANY accounts, so that is kinda a pain for us. We do not have very many locks though - so I'd like to try your "find `df -i" but I don't follow how it gets the inum to search for.... you have 'read fs inodes' - where does 'fs' come from?
Thanks!!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
Hi Manu - thanks for this detail - I did not know about the ACCOUNT.FILE.STATS so that was very helpful! But we have MANY accounts, so that is kinda a pain for us. We do not have very many locks though - so I'd like to try your "find `df -i" but I don't follow how it gets the inum to search for.... you have 'read fs inodes' - where does 'fs' come from?
Thanks!!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
hi Kathleen,
For performance and reusability, I suggest the AFS method.
About account.file.stat on many account, I suggest you perform it in a loop like
$OPTIONS PICK
SYS9006 = SYSTEM(9006)
ASSIGN 1 TO SYSTEM(9006) ;** SET 9006 TO NOT EXECUTE REMOTE LOGIN-PROC
ORIGIN = @WHO
EXECUTE 'SSELECT UV.ACCOUNT' RTNLIST S
LOOP WHILE READNEXT ACNT FROM S DO
CRT ACNT
EXECUTE 'LOGTO ':ACNT
EXECUTE 'ACCOUNT.FILE.STATS ALL' ;* it's executed into ACNT account
EXECUTE 'LOGTO ':ORIGIN
EXECUTE 'WHO'
REPEAT
ASSIGN SYS9006 TO SYSTEM(9006)
END
About the linux/bash command
find `df -i | while read fs inodes iused ifree iuse mounted; do if [[ ${mounted::1} == '/' ]]; then stat --printf %d:%n $mounted ;echo ; fi; done | grep " : DEVICE : " | cut -d ':' -f2` -inum " : INODE : " 2>/dev/nullfind will work on the result of backtick df-i ... backtick used to define the path of DEVICE numberdf -i return a list of filesystem Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 901120 390122 510998 44% / ... while read fs inodes iused ifree iuse mounted;read load a line from pipe and set each variable with the value of the 'columns' , try this to undestand :df -i | while read fs inodes iused ifree iuse mounted; do echo $fs - $inodes - $iused - $ifree - $iuse - $mounted; donewhile the read load values, the do perform a stat on $mounted path stat print the device_number : rootpath of devicegrep DEVICE it filter only the filesystem corresponding with DEVICE number. cut to extract the rootpath of the device find work on rootpath -inum INODE ------------------------------
manu fernandes
------------------------------
Thanks for the help!
------------------------------
Kathleen Hambrick
Programmer at Colwell
------------------------------
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
------------------------------
Sign up
Already have an account? Login
Welcome to the Rocket Forum!
Please log in or register:
Employee Login | Registration Member Login | RegistrationEnter your E-mail address. We'll send you an e-mail with instructions to reset your password.

