lsof的文件描述符被打开
问题描述:
我用下面的命令找出是否文件描述符被打开:lsof的文件描述符被打开
/usr/sbin/lsof -a -c sqlplus -u ${USER} | grep -l "${FILE_NAME}”
如果不是,我执行一些操作。该文件是从sqlplus
假脱机的日志。
有时lsof
表明文件描述符未打开,但后来我在该文件中找到了一些新的数据。它很少发生,所以我不能重现它。
- 可能是什么原因?
- sql spool如何工作? 它是否保留从SPOOL文件命令打开文件描述符,直到SPOOL OFF命令或打开并关闭多次文件描述符?
答
您可能有一个“race condition”。 Sqlplus打开文件,在其中放入一些新数据,并在检查文件的时间和使用lsof的结果处理文件的时间之间关闭。
通常,避免文件系统中竞态条件的最好方法是在处理文件之前重命名相关文件。重命名是一个相对便宜的操作,这会阻止其他进程在您的进程处理它时打开/修改文件。您需要确保在重命名文件时,如果文件在另一个进程中处于打开状态,您需要等待文件不再通过打开的文件句柄进行访问,然后进程才会处理该文件。
大多数程序员编写的代码充满了竞争条件。这些会导致各种不可重复的错误。如果您记住几乎所有程序都有多个进程共享资源,并且必须共享总是,那么您将成为更好的程序员。
谢谢你的回应。我不能只重命名文件。我需要知道所有数据都写在那里。我可以将一些PROMPT添加到每个sql文件的末尾,并且grep,但我想应该有更好的方法。 – idobr 2013-04-23 23:35:46