实际工程中碰到的一个问题

问题:(Linux 环境) 有一个database (Binary file),被很多clients共享,每个client都有可能read/write这个database。所以正常情况下,每个client在write这个database之前,都需要先hold一把file lock。但发现有一个/一些client并没有遵守这种约定(规则)。如何找出没有遵守这种约定的client(s).

解答:要找出没有遵守约定的clients,首先就要找出有哪些clients会去访问这个database。进程要访问database bin file,需要open/read/write 这个file。换句话说,如果能找到有哪些进程会去open了这个file,这些clients基本上也就找到了。

考虑第一种方法:如果在这个database bin file被访问的时候,能够得到通知,那找出clients就容易了。如何monitor一个file是否被某个进程访问?Linux 下提供了inotify接口/tool,但仔细研究这个接口发现,它只能monitor 有进程访问特定的file,但不能指出是哪个进程。看来inotify tool不能解决问题。

考虑第二种方法:既然不能在file被访问时,得到主动通知。那么能不能主动查询每个时刻,这个file正被哪些进程访问?考虑到在Linux环境下,每个open的文件,都有一个file descriptor与之对应,在/proc/<pid>/fd 下面有所记录,而且每个file descriptor都是一个symbolic link到一个特定的文件名,这正是我想要的。所里立马有想写一个script 每秒poll一下/proc下面的所有process来检查这个database bin file是否被打开。但仔细一想,linux下面没道理没有相应的tool?回想Effetive TCP/IP Programming里面谈到的lsof。binggo!lsof正是我想要的工具。写一个shell,每秒调用lsof一次,grep output是否有database bin file的名字,并找出相应的process/clients。Problem solved!

你可能感兴趣的:(实际工程中碰到的一个问题)