【问题标题】:lsof if file descriptor is openedlsof 如果文件描述符被打开
【发布时间】:2013-04-23 12:21:54
【问题描述】:

我使用以下命令来查看文件描述符是否被打开:

/usr/sbin/lsof -a -c sqlplus -u ${USER} | grep -l "${FILE_NAME}”

如果不是,我执行一些操作。该文件是从sqlplus 假脱机的日志。

有时lsof 告诉文件描述符没有打开,但后来我在这个文件中找到了一些新数据。它很少发生,所以我无法重现它。

  1. 可能是什么原因?
  2. sql spool 是如何工作的? 它是从 SPOOL 文件命令中保持打开文件描述符直到 SPOOL OFF 命令,还是多次打开和关闭文件描述符?

【问题讨论】:

    标签: sql linux oracle lsof


    【解决方案1】:

    您可能有一个“race condition”。 Sqlplus 打开文件,在其中放入一些新数据,然后在 lsof 检查文件和使用 lsof 的结果处理文件之间将其关闭。

    通常,在文件系统中避免竞争条件的最佳方法是在处理相关文件之前对其进行重命名。重命名是一种相对便宜的操作,这会阻止其他进程在您的进程处理文件时打开/修改文件。您需要确保在重命名文件时,如果文件在另一个进程中打开,您需要等到不再通过打开的文件句柄访问该文件时再进行处理。

    大多数程序员编写的代码都充斥着竞争条件。这些会导致各种无法重现的错误。如果您牢记几乎所有程序都有多个共享资源的进程并且必须始终管理共享,那么您将成为一个更好的程序员。

    【讨论】:

    • 感谢您的回复。我不能只重命名文件。我需要知道所有数据都写在那里。我可以在每个 sql 文件的末尾添加一些 PROMPT 并对其进行 grep,但我想应该有更好的方法。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多