基本概况:
我有一台服务器每天每个小时都会生成一个日志文件,这些日志文件会被保留2天,超过2天会被一个程序压缩放到备份目录,日志文件的文件名是有命名要求的,例如:project_log.20130101.01, project_log.20130101.02 意思即:2013年1月1日1点和2点生成的日志文件,他们被备份后的文件名是:project_log.20130101.01.gz, project_log.20130101.02.gz
另外有一台服务器可从这台服务器上抓取文件,它即可以抓取昨天生成的尚未备份的日志,也可以抓取比较早的已经被备份的数据,还可以抓取当天已经生成了的日志文件
#!/bin/sh echo "$0 start at `date +"%F %k:%M:%S"`" 1>&2 export RSYNC_PASSWORD="abcabc" if [ $# -eq 0 ] then # 没有参数 统计日期取一天之前的日期 log_date=`date -d"1 day ago" +'%Y%m%d'` else # 有参数 统计日期取参数指定日期 log_date=`date -d"$1" +'%Y%m%d'` fi dir=`dirname $0` # 在当前目录下的logs/project/创建目录名是统计日期的目录 mkdir -p $dir/logs/project/$log_date log_path="$dir/logs/project/$log_date" err="$dir/tmp/rsync_log_err" # 获得程序运行时的服务器日期 now_date=`date +'%Y%m%d'` if [ $log_date -lt $now_date ] then # 统计日期小于现在的日期 即不输入参数走的路径 for i in `seq -w 00 23` do echo $i 1>&2 :>$err rsync -Cavz log@172.18.11.200::logs/syslog/project_log.$log_date.$i $log_path/project_log.$log_date.$i 2>$err fname="$log_path/project_log.$log_date.$i" if [ -s $err ] && [ ! -s $fname ];then # 尝试抓取备份文件1 rsync -Cavz log@172.18.11.200::disk1/project_log.$log_date.$i.gz $log_path/project_log.$log_date.$i.gz 2>$err cat $err if [ -s $err ];then echo "The file $fname.gz of server is not found" fi fi done else # 统计日期 大于等于现在的日期 即通过命令行输入了日期,但是大于等于程序运行时的服务器日期 now_hour=`date -d "1 hour ago" +"%Y%m%d.%H"` # 取得当前日期之前一个小时时间 echo $i 1>&2 #实在不理解 :>$err #据说是清空文件 echo $now_hour #你这是闹那样,因为定义后没有被使用啊 # 抓取命令 ,注意$i没有定义,so:这是个bug啊 rsync -Cavz log@172.18.11.200::logs/syslog/project_log.$log_date.$i $log_path/project_log.$log_date.$i >$err fname="$log_path/project_log.$log_date.$i" if [ -s $err ] && [ ! -s $fname ];then # 尝试抓取备份文件2 rsync -Cavz log@172.18.11.200::disk1/history/project_log.$log_date.$i.gz $log_path/project_log.$log_date.$i.gz >$err if [ -s $err ];then echo "The file $fname.gz of server is not found" fi fi fi echo "$0 end at `date +"%F %k:%M:%S"`" 1>&2
我觉得这里的主要问题在于有明显的两段代码重复了,并且程序里还有一些BUG