问题:
某台机器的备份脚本不能定期执行,具体表现为备份脚本运行一段时间之后,备份目录/home/dbbackup被删除,导致备份无法正常完成
 
基本情况:
机器无被入侵迹象

备份脚本共有两个:A-bck.sh B-bck.sh分别对项目AB的数据进行备份,分别在0点和1点执行
 
其中A-bck.sh是我之前所写,已经执行了很长时间没有问题
B-bck.sh是同事最近所写,在执行了一段时间之后出现这样的问题
 
脚本说明:
1.
脚本A-bck.sh的内容是将A项目的备份都放在/home/dbbackup/
定期删除7天之前的文件,删除命令写的是find /home/dbbackup/ -mtime +7 |xargs rm -r
 
2.
后来同事为B项目写备份脚本B-bck.sh,内容参照我的原脚本
为了区分项目,他将AB两个项目的备份分开放在/home/dbbackup/A//home/dbbackup/B/,并按此修改了我的备份脚本A-bck.sh中的备份路径
但是脚本里面的定期删除命令并没改,仍然是find /home/dbbackup/ -mtime +7 |xargs rm -r
 
问题原因分析:
每次脚本运行,备份文件都是产生在"/home/dbbackup/项目目录/"
系统里面标识有改动的就是"文件""/home/dbbackup/项目目录"(通过ll命令查看改动日期这两个的修改时间会变化),系统认为"/home/dbbackup"目录并没有改动(ll命令显示此目录的改动日期不变)
所以当同事将项目分了目录的7天过后,脚本运行find /home/dbbackup/ -mtime +7 出来的结果含有"/home/dbbackup/",所以此目录就被删除语句给直接删掉了
 
解决办法:
将删除语句改为
find /home/dbbackup/A/*.* -mtime +7 |xargs rm –r
find /home/dbbackup/B/*.* -mtime +7 |xargs rm -r
即将find细化到项目文件下,这样就保证搜索出来的都是特定目录下的文件了
 
原理:
一个多级目录 /A/B/C/ ,如果C下产生,修改,新建,删除文件或者目录 ,那么修改时间(1l命令显示的时间)会变化的是C,
上级目录AB的修改时间并不会改变
举例: 假设10天前,建好目录结构/A/B/C/,并设置好备份任务,C目录下每天产生备份文件,名称为1,2,3依次累加,到今天产生到文件10
那么使用find /A/B/  -mtime +7 查找修改时间在7天之前的文件,结果为
/A/B/(其修改时间是10天前,也在查找的范围内)
1,2,3(这是7天前产生的文件)
注意C不在,因为每天产生一个备份文件,C的修改时间随之更新
 
要达到只删除文件的目的,就需要具体到目录find /A/B/C/ -mtime +7 或者更加明确到文件find /A/B/C/* -mtime +7
 
教训:
每次修改脚本的时候,必须测试.
这次就是因为同事在修改我脚本的时候,并没有测试我的脚本.(因为我的脚本一直运行正常,他只是修改了一个目录而已,大意的认为没有问题)