从配置来看,job是每隔半个小时执行一次,而且所做的检查工作也不复杂,执行时间应该会很短。配置中这个job已经被禁用,如果我们能够证明这个job是通过crontab执行的就能够说明是操作问题。因为crontab里面已经禁用,但是实际上job还在运行。
通过进程的信息,我们知道这个进程已经执行了近2021分钟,我们来推算一下执行的时间。2021/60=33个小时,从下午3点往前推33个小时,就是在29号早晨的7点左右开始执行的。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25807 oraccbs1 25 0 8728 732 564 R 100.0 0.0 2021:19 /bin/sh -c /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log
这个时候日志就是最好的证明工具,可以在/var/spool/mail/oraccbs1下面找到相应的日志。
日志中最近的一次执行时间是在昨天的早晨7:30,之后就没有任何相关的日志了。
Mon Dec 29 07:30:01 2014
Return-Path: <oraccbs1@localhost.localdomain>
Received: from localhost.localdomain (xxxxx[127.0.0.1])
by localhost.localdomain (8.13.8/8.13.8) with ESMTP id sBT0U1mr013412
for <oraccbs1@localhost.localdomain>; Mon, 29 Dec 2014 07:30:01 +0700
Received: (from oraccbs1@localhost)
by localhost.localdomain (8.13.8/8.13.8/Submit) id sBT0U1Jh013347;
Mon, 29 Dec 2014 07:30:01 +0700
Date: Mon, 29 Dec 2014 07:30:01 +0700
Message-Id: <201412290030.sBT0U1Jh013347@localhost.localdomain>
From: root@localhost.localdomain (Cron Daemon)
To: oraccbs1@localhost.localdomain
Subject: Cron <oraccbs1@xxxxxx> /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
/bin/sh: fork: Resource temporarily unavailable
From oraccbs1@localhost.localdomain Mon Dec 29 07:30:05 2014
。。。。
得到了这些基本信息,就能够基本确定问题了。
至于crontab的修改,可以使用crontab -e来完成。感觉就跟vi操作一样。客户做了确认之后,手工kill掉了那个job,那个问题就解决了。
有很多朋友反馈说为什么会导致CPU异常,因为问题已经修复了,我就从支离破碎的日志中做了简单的分析。
可以通过上面的日志看到fork: Resource temporarily unavailable这个问题,说明在执行crontab job的时候发生了问题,这个问题可能是数据库中其它的资源消耗导致的,也可能是发送消息的环节导致的,因为发送消息的细节是客户来维护,他们不愿意透露更多的细节,我们只能做主观上的猜测了。
不过通过下面的日志能够得到一些信息。就是crontab的job很可能是个僵尸进程。存在两个相同的进程。
>ps -ef|grep DailyChk
oraccbs1 14187 7786 0 14:59 pts/10 00:00:00 grep DailyChk
oraccbs1 25793 1 0 Dec29 ? 00:00:00 /bin/sh -c /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log
oraccbs1 25807 25793 99 Dec29 ? 1-09:58:51 /bin/sh -c /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log
最后从昨天的top截图中发现了如下的内容,可以基本断定问题是crontab 的那个job成为了僵尸进程导致的。
Tasks: 7196 total, 26 running, 7165 sleeping, 0 stopped, 5 zombie
Cpu(s): 7.8%us, 1.5%sy, 0.0%ni, 90.1%id, 0.1%wa, 0.1%hi, 0.4%si, 0.0%st
Mem: 363033360k total, 116349772k used, 246683588k free, 2176616k buffers
Ubuntu使用crontab定时任务