事情的起因
今天本来调休的。
但是故障是不会休息的,于是就在家里办公了。
下午下班的时候,同事发消息给我,问我为什么她的定时任务不能够执行。
我的第一反应就是:/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的.....
至于到底是不是我的手动执行删除了她的家目录数据 ,还是定时任务删除的,当时没在意,不得而知了.....