前言
- #!/bin/bash
- server="$(ls -l /usr/local/lbs/file/area|awk '{print $9}')" ###此为查看要备份的目录,并把他的文件名复制到server_log日志里
- echo $server > /tmp/server_log
注意:在server脚本里面,server="$(ls -l /usr/local/lbs/file/area|awk '{print $9}')" 这个里面,ls -l /usr/local/lbs/file/area是你做备份的目录(是服务端机器的要做备份的目录),还有那个awk '{print $9}'如果你在使用英文字体的服务器上,使用$9;如果是中文字体的服务器上,使用$8,如何查询当前服务器使用哪种字体,可以使用cat /etc/sysconfig/i18n命令,查询结果为LANG="en_US.UTF-8",则是英文字体;查询结果为LANG="zh_CN.UTF-8",则为中文字体。
- #!/bin/bash
- back="$(ls -l /home/beifen/area|awk '{print $9}')" ###此为查看做备份的目录,并把它的文件名负责到back_log日志里
- echo $back> /tmp/back_log
在back脚本里面,ddir="$(ls -l /home/back/area20120208|awk '{print $9}')"这个里面,/home/back/area20120208是你做备份的目录(是备用机器的目录),还有那个awk '{print $9}'如果你在使用英文字体的服务器上,使用$9;如果是中文字体的服务器上,使用$8,
- #!/bin/bash
- a="$(cat /tmp/server_log)" ##定义a为查看服务端日志里文件名
- b="$(cat /tmp/back_log)" ##定义b为查看备份端日志里文件名
- for a in $b; ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。
- do
- rm -rf $b
- done
以上是我编写的运维手册,可能大家很多地方看不明白,我在下面进行一些操作,可以使大家更明白。
下面是进行操作的2太服务器的结构,分别有主机名、ip地址、备份的身份status(是服务端还是备份端)、系统、内核、位数;
1、服务端(我这里是savecenter)
把server上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)
- #!/bin/bash
- server="$(ls -l /tmp/test|awk '{print $9}')" ###此为查看要备份的目录,并把他的文件名复制到server_log日志里
- echo $server > /tmp/server_log
2、备份端(我这里是nagios)
把back上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)
- #!/bin/bash
- back="$(ls -l /tmp/test|awk '{print $9}')" ###此为查看做备份的目录,并把它的文件名负责到back_log日志里
- echo $back> /tmp/back_log
现在脚本已经上传到服务器里,准备工作完成,下面可以测试我的脚本了。但我还是先说明一下,这次实验的目的,是要在服务端(savecenter)里建立1-10,10个文件夹,然后在备份端(nagios)建立1-5,5个文件夹,在使用我的脚本,查看能否自动的进行对比与删除。
但为什么需要在服务端建立10个文件夹,备份端建立5个文件夹呢?
因为如果服务端在做备份的时候,把文件备份到备份端,但可能备份没有完成,还正在进行备份任务,所以可能服务端里有10个文件夹,但备份端里只接受到了5个,但这时服务端的磁盘空间满了,为了获得空间,需要删除已经做备份的文件,所以我这里是在服务端里建立了10个文件夹,备份端建立了5个文件夹,代表备份没有完成、正在进行,然后使用我的脚本,删除服务端里跟备份端的5个文件夹相同名字的文件夹,如果无误,说明我的脚本能够实现备份的文件自动对比、删除。
3、现在在服务端创建1-10,10个文件夹,结果如下图
4、在备份端创建1-5,5个文件夹,结果如下图
5、现在在服务端运行server脚本,就能获得server_log日志,里面内容都是/tmp/test下1-10,10个文件夹的名字;
6、在备份端运行back脚本,能得到back_log日志,里面的内容为/tmp/test下1-5,5个文件夹的名字
7、现在把备份端的back_log日志,传到服务端的tmp目录下
- [root@nagios tmp]# scp back_log 172.16.6.2:/tmp
- back_log 100% 10 0.0KB/s 00:00
8、把rm上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)
- #!/bin/bash
- a="$(cat /tmp/server_log)" ##定义a为查看服务端日志里文件名
- b="$(cat /tmp/back_log)" ##定义b为查看备份端日志里文件名
- for a in $b; ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。
- do
- rm -rf $b
- done
9、在服务端运行rm脚本,它自动对比server_log日志与back_log日志,如果server_log日志里的名字在back_log里,就删除back_log日志里的内容,达到自动对比、删除功能
下面是服务端运行rm的情况与结果图
从图上看,1-5,5个文件夹都已经删除了
下面是备份端的tmp/test下的截图
从上面可以看见,1-5,5个文件夹没有变化,所以我的这个“备份文件自动对比、删除脚本”实现了备份文件的自动对比并自动删除任务。
总结:我编写的这个“备份文件自动对比、删除脚本”适用于备份的文件数目多,正在进行备份任务,但需要删除已经做备份的文件,或者备份任务完成,但备份的文件很多、很杂,删除需要对比在删除,很浪费时间与人力,使用了此脚本加上我前文写的“ssh信任与scp自动复制脚本”与“rsync+inotify实时同步服务器文件”可以实现自动化的、实时的同步或者备份服务器文件,并在正在进行备份任务或者完成备份任务的时候,自动对比、删除已经备份的文件,节省人力与时间。
虽然我写的比较多,而且可能有点复杂,但实现的功能还是很强的,脚本也很容易读懂,如果各位想在自己的环境下运行,需要根据各位的需要进行相应的修改了,如果还有什么不懂的地方,可以留言给我,我会及时的帮各位解答.
下面是我写的“ssh信任与scp自动复制脚本”与“rsync+inotify实时同步服务器文件”链接:
“ssh信任与scp自动复制脚本” http://dl528888.blog.51cto.com/2382721/769519
“rsync+inotify实时同步服务器文件” http://dl528888.blog.51cto.com/2382721/771533
本文转自 dl528888 51CTO博客,原文链接:http://blog.51cto.com/dl528888/777311,如需转载请自行联系原作者