明天计划上个新的应用,需要写脚本获取服务器状态并写入数据库,下午写完脚本,准备先放cron里测试一下。登进服务器,想敲crontab -e加一条计划,结果手一滑就敲成了crontab -r,然后就悲剧了,因为发现没有备份!
没办法,想办法恢复吧。想了想,这种情况,只能去找cron的日志来恢复了。花了点时间,最终还是恢复了。先把crontab文件全部备份一下,然后在这里记录一下恢复过程,或许谁跟我一样悲剧就能用到了。不过我是不想再次悲剧了。
这台机器上crontab的计划有3种,每天运行1次的,每天运行多次的,特定时间运行的。(注:出问题的日期2011-9-1日,用户为wwiiol)
1、恢复每天执行1次的计划
执行下面的命令,就可以获取每天运行1次的计划,然后写入crontab就可以恢复每天运行1次计划了:
grep 'Aug 31.*wwiiol.*CMD' /var/log/cron* | sed 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*CMD (\(.*\))/\1 \2/g' | sort -k 3 | uniq -f 1 -u | sed 's/^\([0-2][0-9]\):\([0-5][0-9]\):\([0-5][0-9]\)/\2:\1 * * */g;s/^0//g;s/\(\):0/\1:/g;s/\([0-9]*\):\([0-9]* \*\)/\1 \2/g'
2、恢复每天执行多次的计划
执行下面命令找出这些计划,然后在分析具体的执行计划:
grep 'Aug 31.*wwiiol.*CMD' /var/log/cron* | sed 's/.*CMD (\(.*\))/\1/g' | sort -n | uniq -c
找到的一条计划的命令:
288 /home/program/playnet_rsync.sh all
这个计划每天运行288次,很容易算出是每5分钟运行1次,再看日志确实是这样的,于是将
*/5 * * * * /home/program/playnet_rsync.sh all
写入crontab文件来恢复计划;
还有一条:
6 /bin/sh /home/wwiiol/test/stat.sh
这个计划每天执行了6次,可能是每4小时执行1次,去看日志,发现:
/var/log/cron:Aug 31 02:00:01 gdb12 CROND[8406]: (wwiiol) CMD (/bin/sh /home/wwiiol/test/stat.sh)
/var/log/cron:Aug 31 02:10:01 gdb12 CROND[8464]: (wwiiol) CMD (/bin/sh /home/wwiiol/test/stat.sh)
/var/log/cron:Aug 31 02:20:01 gdb12 CROND[8504]: (wwiiol) CMD (/bin/sh /home/wwiiol/test/stat.sh)
/var/log/cron:Aug 31 02:30:01 gdb12 CROND[8545]: (wwiiol) CMD (/bin/sh /home/wwiiol/test/stat.sh)
/var/log/cron:Aug 31 02:40:01 gdb12 CROND[8583]: (wwiiol) CMD (/bin/sh /home/wwiiol/test/stat.sh)
/var/log/cron:Aug 31 02:50:01 gdb12 CROND[8621]: (wwiiol) CMD (/bin/sh /home/wwiiol/test/stat.sh)
原来是2点到3点之间每10分钟执行一次,将
*/10 2 * * * /bin/sh /home/wwiiol/test/stat.sh
写入crontab文件来恢复计划。
3、恢复特定时间运行的计划
这一项是可能存在无法恢复的情况的,因为日志记录的时间是有限的,很可能半年运行一次,甚至一个月运行一次的计划都无法通过日志找出。幸运的话,仔细分析日志就可以找出。
查看日志,发现共有有一个多月的日志,执行命令:
grep 'wwiiol.*CMD' /var/log/cron* | sed 's/.*CMD (\(.*\))/\1/g' | sort -n | uniq -c
可得结果:
32 /bin/sh /home/wwiiol/backup.sh
32 /bin/sh /home/wwiiol/load_data.sh
5 /bin/sh /home/wwiiol/lt_colonel_update.sh
32 /bin/sh /home/wwiiol/program/load_data.sh
33 /bin/sh /home/wwiiol/program/reg_extend.sh
192 /bin/sh /home/wwiiol/test/stat.sh
32 /bin/sh /home/wwiiol/test/total.sh
33 /bin/sh /home/wwiiol/update_same_ip_account.sh
9406 /home/program/playnet_rsync.sh all
对比已经恢复的计划,发现有一条特殊记录:
5 /bin/sh /home/wwiiol/lt_colonel_update.sh
再查看日志,发现:
/var/log/cron:Aug 30 06:00:01 gdb12 CROND[26093]: (wwiiol) CMD (/bin/sh /home/wwiiol/lt_colonel_update.sh)
/var/log/cron-20110807:Aug 2 06:00:01 gdb12 CROND[3056]: (wwiiol) CMD (/bin/sh /home/wwiiol/lt_colonel_update.sh)
/var/log/cron-20110814:Aug 9 06:00:01 gdb12 CROND[23422]: (wwiiol) CMD (/bin/sh /home/wwiiol/lt_colonel_update.sh)
/var/log/cron-20110821:Aug 16 06:00:01 gdb12 CROND[912]: (wwiiol) CMD (/bin/sh /home/wwiiol/lt_colonel_update.sh)
/var/log/cron-20110828:Aug 23 06:00:01 gdb12 CROND[7585]: (wwiiol) CMD (/bin/sh /home/wwiiol/lt_colonel_update.sh)
原来这个计划是每周运行一次,查看一下日期,发现是每周二运行,可以将
0 6 * * 2 /bin/sh /home/wwiiol/lt_colonel_update.sh
写入crontab文件来恢复这个计划。
不过,最后还是要说一点,一定要备份crontab文件,否则如果有上百条crontab计划的时候,真是要郁闷死啊。