场景一
crontab的定时任务不能自动执行,但是手动执行脚本一直能成功。最后发现是脚本里用了系统的环境变量。 crontab与环境变量 不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点: 1)脚本中涉及文件路径时写全局路径; 2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时首先大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
场景二
伤不起的DOS格式文件 全服LOGDB要增加一个crontab条目,需要定时运行一个脚本。在分发完脚本之后,打算用crontab File命令加载File中的crontab条目。于是在本地创建了File文件,使用crontab -l将条目复制到本地的File文件中,然后再添加上新的条目。保存完文件后,将文件上传到运维机,并用ijobs进行分发,最后使用crontab File命令进行重新加载。下面来见证悲剧的时刻:脚本没有执行。 首先先去看看crontab,条目存在,说明在加载File文件中条目是没有问题的,然而这些脚本都没有定时运行。于是查看系统日志/var/log/messages文件,发现了如下的情况: ^M,这个是dos格式的换行符。悲催的,难道使用了本地加载文件才出现如下状况吗?于是使用cat –A 命令来查看隐藏的字符串,果然结尾都有^M的符号在。在使用dos2unix命令后对该文本格式进行转化后,^M字符消失,然后使用crontab File重新加载后,crontab条目中的脚本正常运行。
场景三
没有加载的crontab 不知道各位童鞋有没有遇到这种情况:整个crontab中的脚本都没有运行,已经排除上述的两种情况后还是存在问题,那么恭喜你,中奖了。去看看/var/log/messages的日志吧,看看有没有找到如下的提示: no passwd entry. 找到的话,果断重启crontab吧,crontab加载crontab文件出现了问题。在重启crond进程后问题得到解决。在每次修改crontab中的内容后,系统会在下一分钟初加载最新修改后的crontab,加载完之后,/var/log/messages中会有一条RELOAD的日志: reload. 所以不必心急crontab中的脚本没有立即执行,可能还没有加载上最新crontab的缘故。
爬坑大全
1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。 2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。 3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。 4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。 5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。 6)看下crond服务是否正常启动,有时是服务没启动,有时是时间点没写对。 7)selinux有时会让你抓狂,甚至导致crontab异常,所以养成好习惯,关掉selinux:
临时关闭selinux:
setenforce 0 //设置SELinux 成为permissive模式
彻底禁用selinux:
sudo vim /etc/sysconfig/selinux //将SELINUX=enforcing修改成SELINUX=disabled。
重启后才能生效。
8)在crontab加载文件的时候,务必确保加载的文件是UNIX格式,而非DOS格式,使用dos2unix命令进行转换,使用cat –A命令查看文件。 9)crontab中的环境变量和当前shell的环境变量不同,为保证脚本顺利运行,可将当前shell的环境变量PATH导入脚本中 10)出现no passwd entry日志记录,重启crond看看。 11)crontab修改后重新加载时,会在日志中记录RELOAD,由此可确认修改后的crontab内容是否正常加载。
本文来自网易实践者社区,经作者林伟壕授权发布。