一起诡异的Crontab事件定位 - 所有计划任务被意外清空


今天,我接到了一位同事的电话,说有一个严重的问题需要处理,“所有的Crontab计划任务都被人清空了”。
我立刻问有没有备份,回答是“可能没有”。这样一来,情况就变得非常紧急了,因为我们每天在跑的计划任务有上百条。

于是我登陆到服务器,检查了所有相关的日志,最后终于找到了事故的原因,并且恢复了Crontab计划任务。

事故原因:
如果我们在SSH远程终端中敲下“crontab”命令之后,远程连接被一些原因(比如 糟糕的网络,程序异常)意外终止了,那么Crontab计划任务就会被操作系统所清空。
听起来很不可思议,但是经过在虚拟机上的多次测试,它确确实实的发生了。
测试方式为 用SecureCRT开一个SSH窗口,然后敲下命令“crontab”,接着在“任务管理器”中直接杀掉SecureCRT进程,再通过另外一个SSH窗口执行“crontab -l”,就会发现,所有的计划任务都不存在了。
在今天事故发生的时间点上,就有人在服务器上遇到了这样的情况。

计划任务的恢复:
很幸运的,在一个目录下我找到了一个近期的备份文件,因此得以恢复。
但我们不能指望有这样的好运气存在,因此一个可行的恢复方案是通过crontab日志文件 /var/log/cron 来进行,将其中所有的执行内容提取出来,找到执行的时间规律,从而达到恢复的目的。

反思:
首先,应该立刻对所有服务器上的计划任务进行备份;
其次,应该养成好的习惯,在执行修改操作前对其备份(其实在对任何文件的修改操作前都应该这样做);
其实在计划任务比较多的时候,使用更专业的工具来管理要更合适一些,这方面的推荐软件有hudson以及它的后续版本Jenkins。

下面是一些操作过程中的笔记:
---------------------------------------------------------------------------
[root@server~]# last
……
user2 pts/2 111.112.113.114 Sat Jun 25 09:02 - 09:18 (00:15)
user1 pts/1 111.112.113.115 Sat Jun 25 09:00 - 09:10 (00:10)
user2 pts/0 111.112.113.114 Sat Jun 25 08:57 - 09:18 (00:20)
……

[root@server cron]# ll
……
-rw------- 1 root root 0 Jun 25 09:18 root
……

[root@server ~]# less /var/log/secure
……
Jun 25 09:18:04 server crontab[3609]: (root) REPLACE (root)
Jun 25 09:19:01 server crond[16791]: (root) RELOAD (cron/root)
……

[root@server ~]# less /home/user2/.bash_history
……
exit
su
su
exit
exit
……

[root@server ~]# less /root/.bash_history
……
crontab
crontab -l
……

[root@server user2 ]# ll
……
-rw-r--r-- 1 root root 10628 Jun 15 13:59 crontab.bak
……

---------------------------------------------------------------------------

  1. #1 by denny on 2014/06/10 - 02:30

    定期rsync配置文件到不同timestamp的目录,

    本地开个git repo,也是一招,我想。

(will not be published)
*