用户每天上传文件到指定目录,通过shell脚本尽快识别到新上传的文件已经上传完成,然后就处理新上传的文件。
通过ls记录文件名列表到临时文件中,然后通过diff比较识别新增的文件;
通过文件的大小变化判断新增文件是否上传完成,连续10秒大小不变就认为上传完成了。
每分钟检查一次,循环运行一天后退出,然后通过crontab脚本每天拉起
#!/bin/bash
#0 0 * * * /root/crontab/checkDirFile.sh
current_date=$(date +%Y-%m-%d\ %H:%M:%S)
tomorrow_date=$(date -d tomorrow +%Y-%m-%d\ %H:%M:%S)
#末尾带/
dir_to_check=/path/to/check/
echo "start at $current_date $dir_to_check"
while true;do
sleep 1
current_date=$(date +%Y-%m-%d\ %H:%M:%S)
echo "$current_date" |tee heartbeat.txt
# 只监控一天,然后就退出,通过crontab再拉起
if [[ "$current_date" > "$tomorrow_date" ]]; then
echo "only run one day,shell will exit,then crontab will run a new shell."
break
fi
ls "$dir_to_check" > temp2.txt
echo $current_date
diff file_name_list.txt temp2.txt | grep ">" >> added_files.log
diff file_name_list.txt temp2.txt | grep ">" | awk '{print $2}' | while read -r line;do
current_date=$(date +%Y-%m-%d\ %H:%M:%S)
file_name="$dir_to_check$line"
echo "$file_name $current_date"
#如果文件连续10秒没有变化大小则认为文件已经传输完成
prev_size=$(du -b $file_name | awk '{print $1}')
count=0
while [ $count -lt 10 ]
do
echo $count
current_size=$(du -b "$file_name" |awk '{print $1}')
if [ $current_size -eq $prev_size ] ; then
echo "no change ${count} ${current_size}"
count=$((count + 1))
else
echo "changed"
count=0;
fi
prev_size=$current_size
sleep 1
done
echo "file no change, upload completed. "
#do some things here
echo "${file_name}"
done
mv temp2.txt file_name_list.txt
sleep 59
done