我使用以下命令查明文件描述符是否已打开:
/usr/sbin/lsof -a -c sqlplus -u ${USER} | grep -l "${FILE_NAME}”
如果不是,我会执行一些操作。该文件是从sqlplus
假脱机的日志。
有时lsof
表示文件描述符没有打开,但后来我在这个文件中找到了一些新数据。它很少发生,所以我无法重现它。
答案 0 :(得分:0)
你可能有一个“race condition”。 Sqlplus打开文件,在其中放入一些新数据并在lsof检查文件和使用lsof结果处理文件的时间之间关闭它。
通常,避免文件系统中的竞争条件的最佳方法是在处理之前重命名相关文件。重命名是一个相对便宜的操作,这会阻止其他进程在您的进程处理它时打开/修改文件。如果文件在重命名时在另一个进程中打开,则需要确保在进程处理之前等待它不再通过打开的文件句柄进行访问。
大多数程序员编写充满竞争条件的代码。这些会导致各种不可再生的错误。如果您记住几乎所有程序都有多个进程共享资源并且共享必须始终进行管理,那么您将是一个更好的程序员。