用户每天上传文件到指定目录,通过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;dosleep 1current_date=$(date +%Y-%m-%d\ %H:%M:%S)echo "$current_date" |tee heartbeat.txt# 只监控一天,然后就退出,通过crontab再拉起if [[ "$current_date" > "$tomorrow_date" ]]; thenecho "only run one day,shell will exit,then crontab will run a new shell."breakfils "$dir_to_check" > temp2.txtecho $current_datediff file_name_list.txt temp2.txt | grep ">" >> added_files.logdiff file_name_list.txt temp2.txt | grep ">" | awk '{print $2}' | while read -r line;docurrent_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=0while [ $count -lt 10 ]doecho $countcurrent_size=$(du -b "$file_name" |awk '{print $1}')if [ $current_size -eq $prev_size ] ; thenecho "no change ${count} ${current_size}"count=$((count + 1))elseecho "changed"count=0;fiprev_size=$current_sizesleep 1donedoneecho "file no change, upload completed. "#do some things hereecho "${file_name}"sleep 59
done