Linux 如何等待文件关闭

Linux 如何等待文件关闭,linux,Linux,我有一个外部进程,可以开始写入文件如何编写等待文件关闭(当其他进程完成写入时)的脚本。简单的方法:让脚本执行程序并等待它完成。这不好,而且写它会让我感觉脏/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;

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

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

这不好,而且写它会让我感觉脏/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;

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

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

  • 如果无法控制进程,但知道进程在写入文件后终止,则可以找出进程ID,然后检查进程是否仍在使用
    kill-0$PID
    运行。如果之后
    $?
    0
    ,则该进程仍处于活动状态

  • 如果不可能,则可以使用
    lsof-np$PID
    获取此过程中所有打开文件的列表,并检查您的文件是否在列表中。不过,这有点慢

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


重命名可以确保其他所有人看到整个文件以及所有数据,或者什么也看不到。

循环直到文件稳定为止。如果您正在等待实验结果,这应该可以工作(因此您不需要实时事件处理):


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

  • 创建一个
    inotify
    实例
  • 为感兴趣的文件路径的
    IN\u CLOSE\u WRITE
    事件的实例添加一个监视
  • 等待事件发生
  • 使用适当的代码退出
  • 然后在脚本中,以文件路径作为参数调用程序


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

    如何
    !lsof--/path/to/file
    ?@RubyTuesdayDONO:那怎么办?我建议使用它作为一种更直接的方式来查询是否有任何进程打开了该特定文件(而不是通过最有可能的进程打开的所有文件的列表进行grep)。您关于在完成后将临时文件重命名到位的第二个建议似乎是一个更好的选择-我只想强调一下,
    lsof
    是一个复杂的命令,有多个向量,可以精确地返回所需的信息。@RubyTuesdayDONO:Ah。我建议总是为这样的用例指定选项
    -n
    ,这样
    lsof
    就不会花很多时间进行DNS查找。当使用带有文件名参数的
    strace
    时(例如,
    cat>>file&strace-f-e trace=network lsof--file
    ),我没有在我的Fedora(OpenVZ)VPS上观察到任何DNS查找-尽管我同意,尽可能明确是一个好习惯,因为实现可能会有很大差异:]
    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