crontab 问题排查
上下文:项目中需要每天将前一天的搜索日志、视频点击量等文件处理生成联想词库的数据源,于是写了个简单的 shell 脚本进行文件处理,生成最终的数据源,同时记录 log,并添加了个 crontab 项每天定时运行。系统:ubuntu 14.04
问题:观察一段时间后,在最初的两三周,脚本一直能够正常运行,但是后来某一天查看日志发现,脚本再某一天之后就一直没有运行过了。
排查:
crontab 配置:
0 7 * * * root bash /home/ubuntu/code/batch.sh &> /dev/null
第一天:首先当然是查看调度日志(crontab 的调度日志默认被输出到 /var/log/syslog 中),发现脚本一直是被正常调度的,也没有出现调度失败的情况。于是拷贝一项配置:
45 10 * * * root bash /home/ubuntu/code/suggest_datasource_gen.py &> /dev/null
到当前时间之后的几分钟,等待看脚本是否被运行,查看调度日志,脚本正常调度,从脚本 log 显示,脚本成功运行,神奇!于是 reload 了一下 cron,等待第二天的奇迹发生。
第二天:登录后从脚本log 看出脚本仍然没有被运行,放开脚本的输出(去掉 &> /dev/null,crontab 调度的任务如果有输出是会以邮件的形式发送到用户邮箱的),reload 脚本,等待奇迹。。
第三天:脚本仍然未被运行,查看 /var/log/syslog,仍然没有任何输出,查看用户邮箱,发现系统没装邮件服务器。。于是用 apt-get 装了个 postfix,奇迹。。
第四天:脚本未被运行,这次可以看出 root 账户收到几封邮件了,邮件显示:
bash: /home/ubuntu/code/batch.sh: No such file or directory
好吧,手动运行这条命令,脚本运行成功。。
想想可能是权限问题,可是 cron 是以 root 权限运行的
上网求祝发现的确有不少人遇到过类似的情况:
https://askubuntu.com/questions/23009/why-crontab-scripts-are-not-working
第一个答案:脚本被调度时的 env 和交互 shell 的 env 不同,有道理!可是为啥之前一段时间可以正常运行呢?想不通
第二个答案:
Although cron requires that each entry in a crontab end in a newline
character, neither the crontab command nor the cron daemon will detect
this error. Instead, the crontab will appear to load normally. However,
the command will never run. The best choice is to ensure that your
crontab has a blank line at the end.
4th Berkeley Distribution 29 December 1993 CRONTAB(1)
握草,我觉得就是这个 bug导致的,给我的配置加上一个\n,等待明天奇迹
第五天:
脚本仍旧未被运行,纳尼。。我觉得需要重装一下系统
然后我添加了一个新任务
0 7 * * * root ls /home/ubuntu/yuzhuo/code/suggest_corpus_generator/batch.sh
看明天输出
第六天:
log 显示:
ls: cannot access /home/ubuntu/code/batch.sh: No such file or directory
手动运行一下显然存在这个文件,胸中一万头草泥马奔腾。。
好吧,假装一下你找不到这个文件吧,于是又添加了若干个相同时间的调度任务:
0 7 * * * root ls /home/ubuntu/code/batch.sh 0 7 * * * root ls /home/ubuntu/code 0 7 * * * root ls /home/ubuntu 0 7 * * * root ls /home 0 7 * * * root ls /
第七天:
答案开始浮出水面:
log 显示
ls: cannot access /home/ubuntu/code/batch.sh: No such file or directory
ls: cannot access /home/ubuntu/code: No such file or directory
ls /home/ubuntu 任务运行成功,输出:Access-Your-Private-Data.desktop
README.txt
显然 /home/ubuntu 目录下不是这些文件,google 一下文件 Access-Your-Private-Data.desktop 的作用,找到如下链接,问题得以解决:
http://techqa.info/ubuntu/question/454309/intermittent-crontab-problem
大致内容就是 ubuntu 支持一种加密文件系统,在没有用户登录的时候,将 /home/ubuntu 给卸载了,导致 crontab 访问不到/home/ubuntu 目录下的文件
Caveats
There are a few minor caveats that one must keep in mind about these encrypted configurations.
When you are not logged into your system, data in your home directory is not accessible in plain text. This, of course, is by design. This is what keeps an attacker from gaining access to your files. However, this means that:
- Your cronjobs may not have access to your Home Directory