Linux crontab执行错误问题

时间:2021-01-13 08:01:02

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 代表空设备文件。