我有一个脚本,可以将文件从目录上传到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时,它可以正常工作(上传整个文件)。当我将文件上传到受监视的目录时,程序也会输出(如下)。
上传:sunlight / turnaroundtest.json到s3://turnaround-sunshine/turnaroundtest.json
答案 0 :(得分:1)
您可以在后台运行脚本:
./Script.sh &
或者您可以打开第二个终端窗口来运行它。
您的脚本在创建文件后立即开始上传文件,这使编写者没有时间完成编写文件。没有可靠的方法来告知文件何时完成。解决此问题的最佳方法是更改书写应用程序。它应该首先将文件写入另一个目录,然后在完成后将其移至该目录。只要两个目录位于同一文件系统中,移动是原子的,因此上载脚本将只看到完整的文件。
如果由于某种原因不能使用两个目录,则可以使用文件名模式。它可以将文件写入<filename>.temp
,然后最后将其重命名为<filename>
。然后,您的脚本可以忽略.temp
个文件:
while read newfile;
do
case "$newfile" in
*.temp) ;;
*) aws s3 sync sunshine s3://turnaround-sunshine/ ;;
esac
done