由于上次做项目的时候,客户要求需要对系统状态做自动备份,当时觉得自己写得脚本实在是不够上档次,就开始在网上搜索各种比较好的脚本,现在找到了一个还挺不错的脚本,与大家一起来解析分享一下。其实我第一遍看的时候中间有一小部分没有弄懂,觉得里面的语法真的是用的恰到好处,不过还是稍稍修改了一点。
#说明使用的是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
由上可以证明这个备份脚本是正确的,不会有任何问题,大家也可以提出自己的建议给我,一起进步!
转载于:https://blog.51cto.com/lqiong/1542483