我使用以下命令查找是否打开了文件描述符:
/usr/sbin/lsof -a -c sqlplus -u ${USER} | grep -l "${FILE_NAME}”如果不是的话,我会执行一些动作。该文件是一个从sqlplus中产生的日志。
有时,lsof会告诉文件描述符没有打开,但随后我在这个文件中找到了一些新的数据。它很少发生,所以我无法复制它。
发布于 2013-04-23 13:00:18
你可能有一个"种族条件“。Sqlplus打开文件,在lsof检查文件和使用lsof的结果处理文件之间将一些新数据放入其中并关闭它。
通常,避免文件系统中的争用条件的最佳方法是在处理文件之前重命名相关文件。重命名是一种相对便宜的操作,它阻止其他进程在处理文件时打开/修改文件。您需要确保如果文件在重命名时在另一个进程中打开,则在进程处理该文件之前,要等到不再通过打开的文件句柄访问该文件为止。
大多数程序员编写的代码中到处都是竞争条件。这些都会引起各种无与伦比的臭虫。如果您记住几乎所有的程序都有多个进程共享资源,并且必须始终管理共享,那么您将是一个更好的程序员。
https://stackoverflow.com/questions/16169248
复制相似问题