如何等待文件关闭

时间:2012-03-08 14:00:30

标签: linux

我有一个开始写入文件的外部进程。
如何编写等待文件关闭之前的脚本(当其他过程完成写入时)。

5 个答案:

答案 0 :(得分:3)

有几种方法可以实现这一目标:

  • 如果可以,请从脚本启动该过程。当进程终止时,脚本将继续运行,这意味着它无法再将更多数据写入文件。

  • 如果您无法控制流程,但是您知道该流程在写入文件后终止,则可以找到流程ID,然后检查流程是否仍在使用kill -0 $PID运行。如果之后$?0,则该过程仍然有效。

  • 如果无法做到这一点,那么您可以使用lsof -np $PID获取此过程的所有打开文件的列表,并检查您的文件是否在列表中。但这有点慢。

[编辑] 请注意,所有这些方法都有点脆弱。正确的解决方案是让外部进程使用临时名称写入文件,然后在完成后立即重命名。

重命名确保其他所有人都可以看到包含所有数据的整个文件,或者没有任何内容。

答案 1 :(得分:2)

简单的方法:让脚本执行程序并等到它完成。

答案 2 :(得分:2)

使用inotify创建一个小型C程序。该计划应该:

  1. 创建inotify个实例。
  2. 为感兴趣的文件路径的IN_CLOSE_WRITE事件添加一个监视实例。
  3. 等待活动。
  4. 使用适当的代码退出。
  5. 然后在您的脚本中,以文件路径作为参数调用程序。

    您可以通过添加超时参数来扩展它,并允许指定不同的事件。

答案 3 :(得分:1)

这不好看,它让我觉得写它很脏... /tmp/foo.txt是正在测试的文件......

#!/bin/bash

until [ "$( find /proc/*/fd 2> /dev/null | 
   xargs -i{} readlink {} |
   grep -c '^/tmp/foo.txt$' )" == "0" ]; do

   sleep 1;
done;

答案 4 :(得分:0)

循环直到文件稳定接近,如果您正在等待实验结果,这应该可行(因此您不需要实时事件处理):

EXPECTED_WRITE_INTERVAL_SECONDS=1
FILE="file.txt"
while : ; do
        omod=$(stat -c %Y $FILE)
        #  echo "OLD: $omod"
        sleep $EXPECTED_WRITE_INTERVAL_SECONDS
        nmod=$(stat -c %Y $FILE)
        #  echo "NEW: $nmod"
        if [ $omod == $nmod ] ; then
                break
        fi
done