一个朋友向我咨询他遇到的一个问题。
Centos的操作系统,自然是主流应用的WWW。近期无缘无故的Cron失效,所有的任务都无法执行。多次重启主机,重启Cron服务均是如此。
起先我由于没有拿到控制台,怀疑是Cron经典的环境变量问题,修改了半天也是白忙。总算此兄开恩,将root的权限给了我。:)
登入主机,crontab -l,所有命令都正常,单独执行也都OK。跑到/var/spool/cron下也没有发现有什么文件权限之类的问题。
每天都被cron mail挤爆信箱的我觉的从邮件入手吧。谁知那位兄弟没有配置邮件系统,而且直接disable了sendmail服务。
这里需要说明的是,Crontab 默认会将定时执行的结果通过mail返回给用户。如果没有启动Sendmail服务,系统(确切的应该是sendmail程序)将会把每一个结果保存为一个文件,放置在/var/spool/clientmqueue下。
cd /var/spool/clientmqueue 呵呵,果然!等了半个多小时愣是没有给list出来。du -sh 也是个费时费力的操作了。
mv * 太慢,直接 ls | xargs rm 操作,清空了所有的文件,重试了一下,搞定!
解决此类方法的建议:
- 开启sendmail服务,这是最佳途径。
- 每条命令使用 ‘>>’ 指向一个日志文件,如果觉得返回没有必要,就直接 >> /dev/null 2>&1 丢弃掉。
- 更加变态的方式就是再加一条cron,定期清空 /var/spool/clientmqueue
PS:
之前没有弄过,完成测试的时候才理清的一个Cron问题:
30 3 * * 1 dosomething ,是每周一3点半执行是确信无疑的了。
30 3 1 * 1 dosomething, 是当1号是周一的时候执行吗?不是!是1号,或者周一的时候执行。crontab中的星期是一个“或”的概念,而非其他的“和”的概念。
很不错的博客,看了一下内容,很对我胃口吖,RSS之。
“# 每条命令使用 ‘>>’ 指向一个日志文件,如果觉得返回没有必要,就直接 >> /dev/null 2>&1 丢弃掉。”
请问上面中的 >&1 是什么意思?&在这里有什么作用,以前看过,忘记了,但又不知道怎么Google之~
1为标准输出stdout, 2为标准错误stderr.
ls >> /dev/null 2>&1 可以理解为“ls后结果输出到/dev/null,等价于不输出,但其中的2 标准错误输出回1,标准控制台,由于加了&,意味着后台输出到控制台。”