crontab 不能正常运行的原因分析方法
我是做运维开发的,偶尔会有人来问我一些关于"crontab不能正常运行"的问题。
本着“授人以鱼不如授人以渔”的观点,在这里总结一下可能发生该状况的原因.
在分析之前,我们先确认一个前提: 就是操作命令本身的执行并没有问题,在shell下可正常执行,没有权限问题,更没有参数缺少的问题.
简单的校正方法就是: 将crontab -l
下的该命令,直接复制到shell下运行,看是否正常执行.
在以上的前提下,可能是如下的几个原因,导致了crontab不能正常执行.
crontab中包含非法字符
比如这个命令:
echo `date +%Y%m%d`
这个命令,在shell下直接执行是没问题的,但是在crontab中就有问题. 原因是crontab中不能出现非法字符%
解决方法也很简单,既可以将命令写在另一个sh文件中,然后再来执行该文件;也可以使用\
符号进行转义.
可以在 man 5 crontab
中查看到该问题的说明,如下图:
/etc/crontab 与 contab -e 两种方式格式混淆
定时任务有两种编辑方法,一种是root用户下编辑/etc/crontab文件: vi /etc/crontab
;
一种是在某个用户下(可能是root,可能非root),执行crontab -e
进行编辑.
前者的格式相比于后者,多了一个执行命令的“用户身份”的字段.如下图:
这很好理解, /etc/crontab 对所有用户都是同一个文件,当然需要指明是以哪个用户来执行命令了.
以 echo "right" >> /tmp/output_right.txt
命令为例,
在前者需要写成 */1 * * * * root echo "right" >> /tmp/output_right.txt
在后者需要写成 */1 * * * * echo "right" >> /tmp/output_right.txt
crond服务未启动
这个就太好检查了, 执行service crond status
查看该服务的运行状态.
如果进程已经dead,重启一下即可 service crond start
命令的输出包含中文等unicode
这个仅仅是一个可能的原因, 不同系统上的表现不是绝对的. 可能跟操作系统的默认编码有关.总之避免中文的输出吧.
比如一段简单的python代码:
# -*- coding: utf-8 -*-
python u'中文'
以上代码保存为文件demo.py. 在shell中执行 python demo.py
是没问题的, 但是在crontab就可能出现问题.