细思极恐:被软链接拯救的数据

事情的起因

今天本来调休的。
但是故障是不会休息的,于是就在家里办公了。
下午下班的时候,同事发消息给我,问我为什么她的定时任务不能够执行。
我的第一反应就是:/etc/security/access.conf限制了普通用户的crond,登陆之后证明我是错误的,事实上的确如此:所有节点是放开普通用户的定时任务权限的。
那么问题出在哪里,验证一下不就知道了。
我用自己的普通用户登陆系统之后,编辑了一个测试任务如下:

# crontab -e

*/1 * * * * date >> /home/liwl/hello_test.txt

保存退出之后,一分钟过后,发现了生成了hello_test.txt文件。那么系统层面应该是没毛病的。

我切换到她用户的家目录下,在隐藏目录.rms下找到了她的脚本:cleanup.sh
很直白的工作:清除垃圾
# vim cleanup.sh,如下:

#!/bin/sh
file=`ls |grep -v cleanup.sh|xargs`
rm -rf $file

脚本看起来挺清爽的,粗略看一下,并无毛病:

查找目录下的所有文件,删除除脚本之外的所有东西

然后我通过# crontab -e 查看了一下她的定时任务写法:

*/1 * * * * /home/ligl/.rms/cleanup.sh

感觉没什么毛病啊?!

不管了,先测试脚本能不能执行

灾难的开始

定时任务无法执行,那就手动执行一下试试看:

# cd /home/ligl/.rms/

# ./clearup.sh && ls -l

没毛病啊,文件妥妥都删掉了。那定时任务为啥不能够执行呢?难不成绝对路径不行?

然后,我# cd /home/ligl/.rms/ && touch hello

# /home/ligl/.rms/cleanup.sh

OK,执行完毕,# ls -l看一下,卧槽! hello还在! 什么情况?!

无奈之下我# cd了一下,#ls

更绝望的事情发生了!!!

家目录下空的!!!空的!!!

我突然明白过来发生什么事情了,赶紧电话同事,确认一下是不是数据还在。

同事被我这么一下,也是懵逼了。但是她ls 之后发现,数据还在啊!!!

我不信!!!

我重新登陆,ls 空的,再退出登陆ls ,还是空的!从其他节点登陆,ls 空的,绝望了......

rm -rf 的事情,发生在我一个系统管理员身上了....

可是同事的数据,已经无法恢复了。

怎么办?怎么办?

绝处逢生

突然同事问我,为什么她那边ls可以看到数据呢?

我也很奇怪,但是突然想起来了:

我们的用户家目录是在NAS上的,用户的数据放置在全局文件系统,通过软连接的方式进入全局文件系统

那也就是说,其实我删掉的是她家目录下的软链接。她能够ls,是因为没有exit出bash环境。

可是为什么我会删除数据呢?

分析了一下定时任务的脚本发现,发现

file=`ls |grep -v cleanup.sh|xargs`

当以绝对路径(定时任务)执行脚本时,这个ls是没有目标目录的,ls默认家目录,然后删除了家目录。

为什么没有删除真实数据,而是软件链接呢?

rm -rf link删除软连接文件
rm -rf link/ 删除软连接和真实数据

重新创建链接,查看正在运行的业务,正常的。好了,到此算是一场惊吓结束了。

总结

虽然脚本不是我写的,但是脚本是我执行的....
总之,感觉是被软连接救了我的前途。
还有啊,脚本能不能认真写,目标文件写成全局变量啊,命令要加参数啊,参数不是你想的那样,要你指定的那样,先调试好再说啊,调试不是简单执行一下就OK的.....
至于到底是不是我的手动执行删除了她的家目录数据 ,还是定时任务删除的,当时没在意,不得而知了.....

posted @ 2017-08-02 18:56 运维笔记 阅读(...) 评论(...) 编辑 收藏