【发布时间】:2012-03-23 13:12:48
【问题描述】:
我有一个脚本在 XX:00 每分钟运行一次。该脚本循环遍历给定目录中的所有子文件夹,并对其中的文件执行操作;
folder=/path/to/directory #Starting directory
someerror=0 #Did we have an error?
#CD to directory. Does it even exist?
cd $folder
RETVAL=$?
[ $RETVAL -eq 0 ] && echo Success changing directory to $folder && mainfolderexist=1
[ $RETVAL -ne 0 ] && echo Failure changing directory to $folder && mainfolderexist=0
if [ $mainfolderexist -eq 1 ]; then
shopt -s nullglob
for dir in $folder/*/
do
thedirname=`basename $dir` #Get directory name
#cd to sub dir. Does it even exist?
cd $dir
RETVAL=$?
[ $RETVAL -eq 0 ] && echo Success changing directory to $dir && subfolderexist=1
[ $RETVAL -ne 0 ] && echo Failure changing directory to $dir && subfolderexist=0
if [ $subfolderexist -eq 1 ]; then
#perform some operation on all files in this directory
someApp -someArgs --name=$thedirname *
else #sub folder doesn't exist
someerror=1
break
fi
#next folder
done
else #main folder doesn't exist
someerror=1
fi
#REPEAT (only if no errors occured)
if [ $someerror -eq 0 ]; then
at now + 1 minutes << END
/bin/bash "$0" "$@"
END
fi
我使用它的方式是,我使用 SFTP 将目录上传到服务器,到像 /home/incoming 这样的文件夹,一旦目录完全上传,我会将其移动到 /path/to/directory。现在这是我担心的部分。
到目前为止,我一直确保只在 XX:XX:02 和 XX:XX:50 之间移动目录,但这是否必要?我想在不考虑系统时间的情况下自动化上传+移动过程,所以我想知道;
- 如果某个目录在 XX:00 正在被移动 (
mv "somedir" "/path/to/directory/somedir") 并且脚本运行并遍历所有目录,该怎么办? - 如果系统在执行 mv 命令期间断电怎么办?如果目录最终会移动一半或类似的东西,我将不得不在执行上述脚本之前编写一个脚本来验证这一点。
【问题讨论】:
-
这与您的问题有点正交,但是您如何知道目录何时“完全上传”?
-
你知道你的源和目标是否在同一个文件系统上吗?如果没有,您可能需要为您的 cron 作业添加一些智能,以使其不接触仅部分复制的目录。
-
@larsks 我没有,这就是我现在手动进行操作的原因。我打算编写一个程序,让服务器知道对目录的期望,开始上传,并在期望与实际交易匹配时移动所述目录。或者类似的东西……除非你有更好的选择?
-
如果您上传档案(使用 tar 或 zip 等)而不是目录,您可以使用 inotify 之类的东西在上传完成时触发事件……但这仅适用于单个文件.使用目录,你可以用一个标志文件来完成同样的事情(即在目录上传完成后,创建一个
<directory>.finished文件或其他东西)。即使您不选择inotify之类的东西,这实际上可能是一个好主意(您的脚本可以只查找.finished文件)。 -
@larsks:仅使用 inotify 与存档有缺点,如果连接中断,它将被 inotify 报告为关闭,因此您仍然需要检查存档是否确实完整。使用 zip 很容易,而使用 tar 或 gz 等其他格式则不然。最后通过上传过程重命名上传的数据是最安全的选择。