Inotifywait 不上传整个文件

Posted

技术标签:

【中文标题】Inotifywait 不上传整个文件【英文标题】:Inotifywait not uploading entire file 【发布时间】:2018-06-21 21:42:21 【问题描述】:

我有一个脚本可以将文件从目录上传到 s3 存储桶。

我的脚本是这样的

aws s3 sync <directory_of_files_to_upload> s3://<bucket-name>/

当我运行这个脚本时,整个文件都会正确上传。 我想在上传新文件时运行这个脚本,所以我决定使用 inotify

我的脚本是这样的

#!/bin/bash

inotifywait -m -r -e create "<directory_of_files_to_upload>" | while read NEWFILE
do
        aws s3 sync sunshine s3://turnaround-sunshine/
done

我的问题有两个

1.当我运行这个脚本时,它会接管终端,所以我不能做任何其他事情

[ec2-user@ip-xxx-xx-xx-xx s3fs-fuse]$ ./Script.sh 
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

    当我从本地上传文件但不上传整个文件时,它会运行。 ec2 中的文件为 2.7MB,但在 s3 中只有 ~350KB。当我自己运行 aws 命令而不进行 inotify 时,它可以正常工作(整个文件被上传)。当我将文件上传到受监控的目录时,程序也会输出(如下)。

    上传:sunshine/turnaroundtest.json 到 s3://turnaround-sunshine/turnaroundtest.json

【问题讨论】:

您在文件创建后立即进行上传。您无需等待作者完成整个文件的写入。 【参考方案1】:

    您可以在后台运行脚本:

    ./Script.sh &
    

    或者你可以打开第二个终端窗口来运行它。

    您的脚本在创建文件后立即开始上传文件,这使得作者没有时间完成编写。没有可靠的方法来判断文件何时完成。解决此问题的最佳方法是更改​​书写应用程序。它应该首先将文件写入另一个目录,然后在完成后将其移动到该目录。只要两个目录在同一个文件系统中,移动是原子的,所以上传脚本只会看到完成的文件。

    如果由于某种原因您不能使用两个目录,您可以使用文件名模式。它可以将文件写入&lt;filename&gt;.temp,然后最后将其重命名为&lt;filename&gt;。然后您的脚本可以忽略 .temp 文件:

    while read newfile; 
    do 
        case "$newfile" in
        *.temp) ;;
        *) aws s3 sync sunshine s3://turnaround-sunshine/ ;;
        esac
    done
    

【讨论】:

以上是关于Inotifywait 不上传整个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 inotifywait 的情况下监视目录的文件更改?

抑制或防止重复的 inotifywait 事件?

利用inotifywait监控主机文件和目录

Inotifywait解决监控子目录树的情况

在 bash 中使用 inotifywait 监视文件夹以进行队列

使 inotifywait 将多个文件更新组合为一个?