1. crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了。
解决方法:
启动crontab,执行命令:
crond
或者
service crond start
如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:
yum -y install crontabs
2. 权限问题
脚本没有x执行权限。
解决方法:
增加执行权限,执行命令:
chmod a+x *.sh
或者直接使用bash的方法执行,执行命令:
/bin/bash *.sh
3. 路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径。
比如:以root身份登录shell后执行一个/root/test.sh,只要执行
./test.sh
就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:
/root/test.sh
PS: 当执行命令包含python等命令,如下:
python /root/test.py
此时如果未执行,可能原因为python需要完整路径,修改如下:
/usr/local/bin/python /root/test.py
4. 时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。
5. 变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。
6. 环境变量问题
crontab的定时任务不能自动执行,但是手动执行脚本能成功。错误原因是脚本里用了系统的环境变量,但是crontab的环境变量与系统的不同。
执行命令:cat /etc/crontab ,如下所示,
[root@localhost byrbbs]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
可以看到crontab的PATH变量的值和一般的环境变量不同,所以,这样会导致有时候执行的命令找不到位置,所以需要在脚本中另外配置环境变量。
- 通过source命令引入环境变量,如 source /etc/profile
- 通过export命令修改需要声明的环境变量, 如export PATH=/usr/local/bin:$PATH
7. crontab中的输出配置
crontab中经常配置运行脚本输出为 >/dev/null 2>&1,来避免crontab运行中有内容输出。
shell命令的结果可以通过‘> ’的形式来定义输出, /dev/null 代表空设备文件。