由于上次做项目的时候,客户要求需要对系统状态做自动备份,当时觉得自己写得脚本实在是不够上档次,就开始在网上搜索各种比较好的脚本,现在找到了一个还挺不错的脚本,与大家一起来解析分享一下。其实我第一遍看的时候中间有一小部分没有弄懂,觉得里面的语法真的是用的恰到好处,不过还是稍稍修改了一点。
#说明使用的是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` 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 -RHpf $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 * * * /home/backup.sh
解释几个语法性的问题:
- 关于if [-f $1]
Linux自动备份脚本--解析
时间: 2024-10-10 02:02:55