在运行脚本之前使用 inotifywait (或替代方法)等待 rsync 传输完成?

Posted

技术标签:

【中文标题】在运行脚本之前使用 inotifywait (或替代方法)等待 rsync 传输完成?【英文标题】:Using inotifywait (or alternative) to wait for rsync transfer to complete before running script? 【发布时间】:2015-11-25 22:23:41 【问题描述】:

我想设置 inotifywait 以便它监视一个文件夹,当某些内容被复制到这个文件夹时(使用 rsync 的 lsyncd)文件夹。

我一直在网上研究是否有人这样做,但我没有找到太多。

虽然我了解一些基础知识,但我并不是最精通 bash 脚本。

这是我发现的一个小脚本,它会暂停一秒钟,但每次传输仍会触发十几个事件:

 EVENTS="CLOSE_WRITE,MOVED_TO"

if [ -z "$1" ]; then
    echo "Usage: $0 cmd ..."
    exit -1;
fi

inotifywait -e "$EVENTS" -m -r --format '%:e %f' . | (
    WAITING="";
    while true; do
        LINE="";
        read -t 1 LINE;
        if test -z "$LINE"; then
            if test ! -z "$WAITING"; then
                    echo "CHANGE";
                    WAITING="";
            fi;
        else
            WAITING=1;
        fi;
    done) | (
    while true; do
        read TMP;
        echo $@
        $@
    done
)

我很乐意提供更多详细信息或信息。

谢谢。

【问题讨论】:

无法确定何时完成了对文件的写入操作。它只能暂停。最好的方法是让创建文件的进程先写入一个临时名称,然后在完成后将其重命名为真实名称。那你就等真名吧。 使用--partial-dir 选项和rsync 将数据写入单独的目录,一旦传输完成,从那里链接的文件将链接到它们的最终目的地。 如果您在公司环境中,一个易于理解的解决方案是在主文件完成后发送一个单独的“标志”文件。您可以包括字节大小、行数、工作日期等作为标题行,以进一步验证文件是否完整传输。祝你好运。 【参考方案1】:

根据您要执行的操作,您可能需要查看Watchman 提供的工具。

有两个可能对您最有用:

    如果您想在文件同步后启动某些操作,您可能需要尝试使用watchman-make。如果操作是运行像make 这样的工具,那么这是最合适的,该工具本身将查看树并产生其输出(换句话说:您不需要将更改文件的精确列表直接传递给你的工具)。您可以让它运行其他工具而不是 make。有一个 --settle 选项,您可以使用它让它在最新的文件更改通知之后等待片刻,然后再执行您的工具。

    watchman-make --make='process-folder.sh' -p '**/*.*'

    watchman-wait 与inotifywait 关系更密切。它还在报告文件已更改之前等待更改解决,但由于此工具不会将多个不同的文件更改合并为单个事件,因此解决周期为 configured as a property of the tree being watched 而不是作为命令行参数

免责声明:我是守望者的创造者

【讨论】:

您好 Wez,感谢您提供的信息。我认为这应该可以解决问题。我会阅读并试一试。这是一个个人项目,我对使用什么工具并不挑剔。一旦我进一步了解,我会回复。

以上是关于在运行脚本之前使用 inotifywait (或替代方法)等待 rsync 传输完成?的主要内容,如果未能解决你的问题,请参考以下文章

bash 脚本 inotifywait 在继续之前等待文件完全写入

inotifywait shell 脚本作为守护进程运行

Inotifywait 不上传整个文件

如何连续运行 inotifywait 并将其作为 cron 或守护进程运行?

在脚本中使用 inotifywait -m 而不创建额外的进程?

使用内部 bash 脚本时 Inotifywait 不起作用