代码之家  ›  专栏  ›  技术社区  ›  Blue

inotifywait不上载整个文件

  •  0
  • Blue  · 技术社区  · 6 年前

    我有一个脚本可以将文件从目录上传到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.
    
    1. 它在我从本地上载文件时运行,但不上载整个文件。EC2中的文件为2.7MB,但S3中只有约350KB。当我自己运行aws命令而不使用inotify时,它可以正常工作(整个文件都会上传)。当我将文件上传到监控目录时,程序也会输出(如下)。

      上传:sunshine/turnaroundtest.json至s3://turnaturn sunshine/turnaroundtest.json

    1 回复  |  直到 6 年前
        1
  •  1
  •   Barmar    6 年前
    1. 您可以在后台运行脚本:

      ./Script.sh &
      

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

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

      如果出于某种原因不能使用两个目录,可以使用文件名模式。它可以将文件写入 <filename>.temp 最后将其重命名为 <filename> .然后脚本可以忽略 .temp 文件夹:

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