crond服务未重启
一般能使用crontab -e
编辑任务的机器crond服务都开启了,但会存在某些时刻内容修改之后新增的任务不启动的问题。比较典型的场景是旧的定时任务还在执行,新的定时任务没有启动。
service crond restart
文件权限问题
脚本没有执行权限,可以使用chmod命令对指定文件增加执行权限,然后可以正常运行。
相对路径问题
crontab运行时通常以当前用户的家目录作为工作目录,比如test用户,more嗯会以/home/test/
为工作目录。具体在crontab里调用一个向工作目录输出文件的脚本,可以观察到这个特点。编写时定时任务时使用绝对路径。
主机时间问题
服务器时间不正确,可能没有与正常时间同步,导致存在时差看不到执行结果。这点可以对/var/log/cron
执行tail -f
来观察。可能会影响一些存在超时机制的程序,需要调整时间,和正常时间保持一致。
环境变量问题
crontab执行时不识别profile的配置变量。有时候命令中含有需要提前导入的环境变量,脚本执行时可以成功,但crontab执行时并没有导入这些变量,也会造成执行失败。
通常,设置变量的三种方法:
- 在/etc/profile文件中添加变量。(持久的,对所有用户有效。)
- 在用户目录下的.bash_profile文件中增加变量。(持久的,对单一用户生效。)
- export命令定义变量。(临时的,只对当前shell有效。)
在/etc/profile里面导入的变量,每次在使用shell的时候可以征程加载内容,但是crontab启动任务时并不会,也就是前两种设置的变量在crontab执行时是无效的。可以改用bash脚本的形式,在运行原定程序之前以export方式导入变量,然后再执行程序。
#!/bin/bash
export DM_HOME=/home/xxx
python /home/test/check.py