由于上次做项目的时候,客户要求需要对系统状态做自动备份,当时觉得自己写得脚本实在是不够上档次,就开始在网上搜索各种比较好的脚本,现在找到了一个还挺不错的脚本,与大家一起来解析分享一下。其实我第一遍看的时候中间有一小部分没有弄懂,觉得里面的语法真的是用的恰到好处,不过还是稍稍修改了一点。

#说明使用的是bash语法来写脚本
#!/bin/bash
#设置日志文件,前提建好了/backup/log目录
LogFile=/backup/log/`date +"%Y-%m"`.log
#备份源目录,这时我们可以写成是“根目录”,因为系统状态一定是保存在根目录下的。
#从网上查资料得知,一般备份系统状态都会备份/etc,/var,/root,/home,/opt,其他的目录都是与系统状态不大重要的
SourceDir=/
#备份目标
BakDir=/backup
#保存20天过期自动删除
RetainDay=20
#备份的内容可以写进project.lst,project.lst填写备份目录,下面是备份的
#具体脚本,其核心是tar打包,并把重要的内容记录到日志文件里
ProjectLst=/backup/project.lst
##################################################
DATE=`date +"%Y-%m-%d"`
echo "backup start at $(date +"%Y-%m-%d %H:%M:%S")" >$LogFile
echo "--------------------------------------------------" >>$LogFile
cd $BakDir
PROJECTLIST=`cat $ProjectLst`
#这个Project是个新变量,进入循环,依次为project中的目录,etc,var,home,root,opt
for Project in $PROJECTLIST    
do
 ProjectData=$SourceDir/$Project
 DestDir=$BakDir/$Project
 PackFile=$DATE.$Project.tgz
 if [ -f $BakDir/$PackFile ]
 then
  echo "backup file have exist !" >>$LogFile
  else
  cp -af $ProjectData $DestDir >/dev/null
  tar -zcvf $PackFile $Project >/dev/null
  echo "backup $Project done into $PackFile" >>$LogFile
  rm -rf $Project
 fi
done
echo "--------------------------------------------------" >>$LogFile
echo "backup end at $(date +"%Y-%m-%d %H:%M:%S")" >>$LogFile
echo " " >> $LogFile
##################################################
#下面的内容就是把刚才备份的内容传到服务器上,前提是你有一个可以访问到底FTP服务器
#put backup to ftp server
HOST=192.168.110.111
FTP_USERNAME=ftpuser
FTP_PASSWORD=123456
cd  $BakDir
echo "start open ftp serverat $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
echo "--------------------------------------------------" >>$LogFile
/usr/bin/ftp -in <<EOF
open $HOST
user $FTP_USERNAME $FTP_PASSWORD
put $DATE.$Project.tgz
bye
EOF
echo "put ftp end at $(date +"%Y-%m-%d %H:%M:%S")" >>$LogFile
#最后上传完毕后再查看本地备份大于20天的自动删除,这样就可以实现本地异地双备份
find $Bakdir -type f -mtime +$RetainDay -name "*.$Project.tgz" -exec rm {} \; >/dev/null
exit 0
#最后我们还可用crontab做个周期性计划,比如每天一次全备份
#59 23 * *  *  /scripts/backup.sh



此处解释两个语法性的问题:

1.关于if [-f $1]

            do 

              command

            done

if 后接测试语句,[]中相当于test命令,-f 是检测后面所跟的变量是否存在

上面语句意为,如果在backup目录中,已经存在备份过的目录,就提示该目录已存在,就不会再备份。 


2.find命令 

-exec rm {} \;这是一种格式,方便find查找,-exec后跟要执行的命令,一对大括号,斜杠和分号
-mtime   是按照文件的更改时间来查找文件,
            例如,find -mtime +n表示文件的更改时间距现在n天以前
                                      -n 表示文件的更改时间距现在n天以内
-type   是查找某一类型的文件  f --普通文件  p--管道文件 
                l--链接文件   d --目录
                b--块设备文件 c--字符设备文件
这句命令的意思是将备份大于20天的自动删除
 


3./dev/null

  功能类似于回收站之类的目录,将命令产生的邮件信息放进去,不然各种信息会撑爆系统的,它会自动清除

 



以下是我操作自动备份的命令:

[root@ZZSRV1 ~]# mkdir /scripts/
[root@ZZSRV1 ~]# cd /scripts/
[root@ZZSRV1 scripts]# ls
backup.sh
[root@ZZSRV1 scripts]# vi backup.sh
[root@ZZSRV1 scripts]# cat backup.sh
[root@ZZSRV1 scripts]# mkdir /backup
[root@ZZSRV1 scripts]# cd /backup
[root@ZZSRV1 backup]# touch project.lst
[root@ZZSRV1 backup]# vi project.lst
[root@ZZSRV1 backup]# cat project.lst
etc
var
home
root
opt
[root@ZZSRV1 backup]# mkdir log
[root@ZZSRV1 backup]# cd /scripts/
[root@ZZSRV1 scripts]# ls
backup.sh
[root@ZZSRV1 scripts]# sh backup.sh
[root@ZZSRV1 scripts]# cd /backup
[root@ZZSRV1 backup]# ll
total 34672
-rw-r--r-- 1 root root  6675038 Aug 20 14:19 2014-08-20.etc.tgz
-rw-r--r-- 1 root root      504 Aug 20 14:19 2014-08-20.home.tgz
-rw-r--r-- 1 root root      130 Aug 20 14:19 2014-08-20.opt.tgz
-rw-r--r-- 1 root root     2367 Aug 20 14:19 2014-08-20.root.tgz
-rw-r--r-- 1 root root 28809044 Aug 20 14:19 2014-08-20.var.tgz
drwxr-xr-x 2 root root       24 Aug 20 14:19 log
-rw-r--r-- 1 root root       23 Aug 20 14:25 project.lst
[root@ZZSRV1 log]# cat 2014-08.log
backup start at 2014-08-20 14:26:34
--------------------------------------------------
backup etc done into 2014-08-20.etc.tgz
backup home done into 2014-08-20.home.tgz
backup opt done into 2014-08-20.opt.tgz
backup root done into 2014-08-20.root.tgz
backup var done into 2014-08-20.var.tgz
[root@ZZSRV1 scripts]# crontab -e
59 23 * * * /scripts/backup.sh

 

   由上可以证明这个备份脚本是正确的,不会有任何问题,大家也可以提出自己的建议给我,一起进步!