手动执行脚本正常,定时任务总是不执行解决方案:
-
首先检查
crond
任务是否正常:service crond status
重启下定时任务:service crond stop、service crond start 、service crond restart
-
在调度的脚本中加载环境变量试试 脚本中添加
source /etc/profile
在crontab -e
编辑定时任务时加上./etc/profile;
与在脚本里加 source /etc/profile
效果一样,例如0 6 * * * ./etc/profile;sh /home/hadoop/ktl_wks/start_1.sh
。
crontab
其实并不知道定时脚本所需要的特殊环境,所以在脚本中要提供所有必要的路径和环境变量,要注意以下:
- 脚本中涉及文件路径时写全局路径
- 脚本执行要用到java或其他环境变量时,通过source命令引入环境变量
- 当手动执行脚本OK,但是
crontab
不执行时。一般都是环境变量惹的祸,可以尝试在crontab
中直接引入环境变量或者在脚本中加载环境变量解决问题 - 新创建的定时任务,至少要过2分钟才可以执行,如果重启
crontab
则可以马上执行。 - 每条定时任务执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,会给系统造成负担, 所以每条定时任务命令后面最好进行重定向处理(定时任务执行的结果正常输出并已经作了一定的处理,,例如追加到某个特定日志文件):
>/dev/null 2>&1
例如0 8 * * * /home/hadoop/ktl_wks/start_JXC_DD.sh >> /home/hadoop/ktl_wks/start_JXC_DD_run.log 2>&1
。 - 当
crontab
突然失效时,可以尝试/etc/init.d/crond restart
解决问题。或者查看定时任务日志看是否有执行报错:tail -100f /var/log/cron
。 - 在
crontab
中%
是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%
,所以date +%Y%m%d
在crontab
里是不会执行的,要换成date +\%Y\%m\%d
。 - 命令
crontab -r
会删除该用户的所有crontab
定时任务。删除crontab
目录/var/spool/cron
中用户的Crontab
文件,定时任务就没有了,所以这个命令危险性很大。