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

时间:2015-11-25 22:23:41

标签: bash inotify inotifywait

我想设置inotifywait,以便它监视一个文件夹,当某些东西被复制到这个文件夹(使用rsync的lsyncd)时,我希望inotifywait能够坐下来等到rsync完成后再调用脚本来处理新的文件夹中。

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

虽然我理解一些基础知识,但我并不是最熟悉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
)

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

谢谢。

1 个答案:

答案 0 :(得分:3)

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

有两个对您最有用:

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

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

  2. watchman-waitinotifywait关系更密切。它还会在报告文件更改之前等待更改结算,但由于此工具不会将多个不同的文件更改合并为单个事件,因此结算时间段为configured as a property of the tree being watched而不是命令行参数

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