我是作运维开发的,偶尔会有人来问我一些关于"crontab不能正常运行"的问题。python
本着“授人以鱼不如授人以渔”的观点,在这里总结一下可能发生该情况的缘由.shell
在分析以前,咱们先确认一个前提: 就是操做命令自己的执行并无问题,在shell下可正常执行,没有权限问题,更没有参数缺乏的问题.运维
简单的校订方法就是: 将crontab -l
下的该命令,直接复制到shell下运行,看是否正常执行.编码
在以上的前提下,多是以下的几个缘由,致使了crontab不能正常执行.操作系统
好比这个命令:code
echo `date +%Y%m%d`
这个命令,在shell下直接执行是没问题的,可是在crontab中就有问题. 缘由是crontab中不能出现非法字符%
blog
解决方法也很简单,既能够将命令写在另外一个sh文件中,而后再来执行该文件;也可使用\
符号进行转义.进程
能够在 man 5 crontab
中查看到该问题的说明,以下图: crontab
定时任务有两种编辑方法,一种是root用户下编辑/etc/crontab文件: vi /etc/crontab
;utf-8
一种是在某个用户下(多是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
这个就太好检查了, 执行service crond status
查看该服务的运行状态.
若是进程已经dead,重启一下便可 service crond start
这个仅仅是一个可能的缘由, 不一样系统上的表现不是绝对的. 可能跟操做系统的默认编码有关.总之避免中文的输出吧.
好比一段简单的python代码:
# -*- coding: utf-8 -*- python u'中文'
以上代码保存为文件demo.py. 在shell中执行 python demo.py
是没问题的, 可是在crontab就可能出现问题.