On Mon, Mar 21, 2016 at 11:39:14AM -0300, Christian Robottom Reis wrote: > indeed does not return any information pertaining NFS client locks, and > I'm not clear whether /proc/locks (on the server side obviously) does or > not. Somewhat OT, but I find it a PITA that /proc/locks gives inode numbers that then need to be looked up individually. I have often been surprised no tool exists to parse that and give you back a report of filenames, so I just put together a small tool that just offloads the work to debugfs. I've attached it in case others might find it useful. (Interestingly, in a network of Ubuntu desktops, the long-term remote lock holders are basically Spotify, Firefox and Zeitgeist, of which the latter two are essentially sqlite.) -- Christian Robottom Reis | [+55 16] 3376 0125 | http://async.com.br/~kiko | [+55 16] 991 126 430 | http://launchpad.net/~kiko
#!/usr/bin/env python3 import os import sys import subprocess import io locksdb = open("/proc/locks") device_inodes = {} for lockline in locksdb: lock_inode_raw = lockline.split()[5] lock_inode = lock_inode_raw.split(":") if len(lock_inode) < 3: #print("Ignoring %s" % lock_inode) continue device = tuple(map(int,lock_inode[0:2])) try: target_device = os.readlink("/sys/dev/block/%s:%s" % device) target_device = target_device.split("/")[-1] except OSError: #print("Device %s:%s not found" % device) continue inode = lock_inode[2] if not device_inodes.get(target_device): device_inodes[target_device] = [] device_inodes[target_device].append(inode) for device in device_inodes: print("-> Inodes on %s" % device) inode_input = [] for inode in device_inodes[device]: inode_input.append("ncheck %s" % inode) debugfs = subprocess.Popen(['debugfs', '/dev/%s' % device], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) debugfs_input = "\n".join(inode_input) out, err = debugfs.communicate(input=debugfs_input.encode()) debugfs_output = out.decode() for line in debugfs_output.split("\n"): if line.startswith("debugfs:"): continue if line.startswith("Inode"): continue print(line)