【转】 cron问题的分析和处理

cron问题的分析和处理

转自:http://www.loveunix.net/thread-108967-1-1.html

 

我们经常遇到客户问,或者在论坛中新人问,在指定时间,cron任务没有达到效果,貌似没运行,但手动执行cron任务的脚本是没问题的,或者运行时间错误,只有3种可能性:

1、脚本或任务命令行没有按照cron的特殊要求来写:cron运行的任务,不带任何环境变量的,即使是 root运行,任务命令行也必须写成: su - root "xxxxx",除非你的脚本运行不依赖任何环境变量,而且所有命令都用绝对路径运行。而手动测试脚本运行的时候,必然是登录进系统运行的,环境变量一应俱全,所以能够正常执行。

2、系统时区环境变量配置错误:造成cron启动的时候用的时区,和你配置cron任务时使用的telnet/终端session的时区变量不一致,这样你意图运行的时间并不是cron会执行的时间

3、BUG:只遇到过一次,AIX 5.3 TL06,由于BUG,cron正常运行一段时间以后,开始出问题,现象是cron进程在,但不干活,不运行任何cron任务,不生成任何日志信息,杀掉cron进程并重启又能好一段时间,然后必然再出同样问题。需要打补丁:
●AIX 5306:IY95222,或AIX 5306 SP4
●AIX 5307:IZ01682
http://www-01.ibm.com/support/docview.wss?rs=1207&context=SG11P&dc=DB510&dc=DB550&q1=cron&uid=isg1IY95222&loc=en_US&cs=UTF-8&lang=all



第一点很多人不知道,但干过几年的工程师基本知道。中国技术人员的UNIX基本基础几乎没有的结果。

因为没环境变量,所以PATH什么的都没有,执行任何命令如果不带绝对路径(除了echo这类shell本身带的命令),实际结果都是找不到命令,如果脚本中都是这类命令,那么每个都执行不成功,看起来就是没有执行。

至于第二点,如果客户说定义在某天某个时刻执行的,结果是执行了,但差了几个小时或者一个小时,可以肯定是第二点这个原因。有两种情况:
系统初始的环境变量与会话环境变量之间的差异:系统初始的环境变量中,肯定有TZ定义的,但各个UNIX不一样,比如AIX是在/etc/environment中,HPUX好像是在/sbin /rc.config.d下面的某个脚本中配置,记不清。任何不需要登录就能运行的进程、服务,基本都是操作系统的进程、服务,都是用的这套环境变量,cron就属于这一类,除非在系统运行时杀掉cron,然后再启动,这时候cron用的就是进行此操作时shell的环境变量,否则它在系统启动时启动用的环境变量,和你登录进去看到的环境变量没有必然关系,因为登录进去可能要走.profile、.kshrc、.login等等,这些都可能改变登录前缺省的环境变量,你登录看到的东西很可能迷惑你。如果初始环境变量TZ不对,那么cron是不管的,只按它启动时的环境变量计算时间,不管你用 crontab -e配置任务的时候shell中TZ是什么。
夏时制:不少装机工程师都是半吊子,不知夏时制为何物,看不懂英文,也不知道夏时制有什么影响。如果基本时区正确,夏时制又配置上了,每年就会有两个时刻,一个把时间往前跳变1小时,一个往后跳变一小时。所以如果客户说以前某cron任务是对的,最近变成执行时间比计划的差了一小时,没人改过什么东西,那可以肯定是这个原因。但对于定义成执行间隔小于等于一小时的任务,很可能没人发现有问题,因为难以察觉。对于执行周期大于等于天为单位的,就很容易察觉。

环境变量没有、时区变量配置错误,这两个,是某cron任务不按时间或者执行有问题(前提是手动执行脚本绝无问题)的全部可能原因。这种情况与BUG的区别的是:总有大部分cron,包括操作系统初始就有一些cron任务,是正常执行的。


检查方法:cron是否执行?是否在所需的时间执行?最方便、统一、最根本的检查方法,是查看cron的日志log。AIX、HPUX是/var/adm /cron/log,其他UNIX也有这个日志,位置可能不同而已。cron自身什么时候启动的,后来都干了什么,什么时刻启动了什么任务,某任务什么时候结束的,里面都有记录。cron进程本身启动时,时区变量对不对,可以看log的第一行,这是首次启动cron的时候,cron记录自己启动的时刻、时区。以这句中与具体时间无关的关键字,跑到log最后,往前搜索第一个,那就是最近一次cron启动的信息,其时区是否正确一目了然。至于是否cron启动的时候时区成了夏时制,对于AIX来说,看这条日志的时区变量,最后是否有大写的DT,有DT就不对——这是夏时制的标志,比如BEIST-8DT,正确的应当是BEIST-8。

至于某任务是否真正运行了,跑到log最后往前搜索你的命令,找不到就没有执行,找到了,看执行时间是否对,执行结果是否有错误。这是判断任务到底是没有执行,还是执行了而由于前述原因貌似没有执行的根本手段,如此才能正确描述问题,而不是像不懂事的小孩一样,我出差去你处,半路飞机栽了,你也不看新闻不查航班动态,污蔑我这个尽心尽力冒着生命危险去支持你,良心大大的好,壮烈牺牲的工程师烈士,说我没有出发过。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值