问题:
某台机器的备份脚本不能定期执行
,
具体表现为备份脚本运行一段时间之后
,
备份目录
/home/dbbackup
被删除
,
导致备份无法正常完成
基本情况:
机器无被入侵迹象
机器无被入侵迹象
备份脚本共有两个
:A-bck.sh
和
B-bck.sh
分别对项目
A
和
B
的数据进行备份
,
分别在
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,
内容参照我的原脚本
为了区分项目
,
他将
A
和
B
两个项目的备份分开放在
/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,
上级目录
A
和
B
的修改时间并不会改变
举例
:
假设
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
教训:
每次修改脚本的时候
,
必须测试
.
这次就是因为同事在修改我脚本的时候
,
并没有测试我的脚本
.(
因为我的脚本一直运行正常
,
他只是修改了一个目录而已
,
大意的认为没有问题
)
本文转自yahoon 51CTO博客,原文链接:http://blog.51cto.com/yahoon/200603,如需转载请自行联系原作者