专栏首页杨建荣的学习笔记crontab导致CPU异常的问题分析及处理(r3笔记第100天)

crontab导致CPU异常的问题分析及处理(r3笔记第100天)

今天查看数据库负载没有发现问题,但是当我使用top命令的时候,发现有一个进程占用了大量的cpu资源而且已经执行很长时间了。这一下子引起了我的注意。

  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 
13578 oraccbs1  18   0 40.2g  49m  29m D 61.0  0.0   6:40.18 oraclePRODB (LOCAL=NO)
17085 oraccbs1  18   0 40.2g  48m  24m R 40.6  0.0  36:44.43 oraclePRODB (LOCAL=NO)
30894 oraccbs1  18   0 40.3g  56m  27m D 38.1  0.0  54:40.46 oraclePRODB (LOCAL=NO) 
10616 oraccbs1  18   0 40.3g  54m  24m R 36.8  0.0  28:15.49 oraclePRODB (LOCAL=NO)
17089 oraccbs1  18   0 40.2g  49m  25m R 36.8  0.0  60:11.90 oraclePRODB (LOCAL=NO)
12103 oraccbs1  18   0 40.2g  31m  22m R 35.6  0.0 149:38.06 oraclePRODB (LOCAL=NO)
30898 oraccbs1  18   0 40.2g  50m  32m D 35.6  0.0  56:03.90 oraclePRODB (LOCAL=NO)

对于这个脚本我比较陌生,一般这些维护性的工作主要都是客户来做的。尝试查看了下这个脚本的内容,发现是一个检测脚本, 脚本的内容很清晰,是来监控归档目录和home目录的空间使用情况,当超过阀值的时候,就发送短信给响应的人来处理。 内容大体如下:

#Send Short Message  if %used greater than 80% : ARCHIVE
        PERC_ARCH_USED=`df -P ${ARCH_PATH}|awk '{ print $5 }'|grep "%"|tr -d "%"`
        export casename=`uname -n`_${database}_Percent_Archive_Used_IS_${PERC_ARCH_USED}
        if [[ $PERC_ARCH_USED -gt 80 ]]; then
        sqlplus -s xxxxx @$myDir/Sql/sendsms.sql $casename
        fi


#Send Short Message  if %used greater than 80% : $ORACLE_HOME
        PERC_HOME_USED=`df -P ${HOME_PATH}|awk '{ print $5 }'|grep "%"|tr -d "%"`
        export casename=`uname -n`_${database}_Percent_HOME_Used_IS_${PERC_HOME_USED}
        if [[ $PERC_HOME_USED -gt 80 ]]; then
        sqlplus -s xxxxxx @$myDir/Sql/sendsms.sql $casename
        fi

这样一个脚本的执行肯定执行一次就完了。它是从哪里执行的呢,首先想到的就是crontab。 crontab是在系统级作为作业自动执行的利器,可以进行各种细粒度的配置,使用也很方面。 先来查看一下crontab的情况,结果在crontab的最后发现一个配置就是正在执行的job.

>crontab -l
#------------------------------------------------
# Test Log DB for house keeping .....
#------------------------------------------------
#0,30 * * * * /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log 

这样来看似乎问题找到了原因,但是奇怪的是根据crontab里面的设置,这个job已经被禁用了,怎么还在运行? 毕竟这个问题还不能完全肯定是操作问题还是其他的原因导致的,就先不轻率的决定,把问题分给客户,从我的角度来说,怎么才能得到一些信息来说明这个问题才是关键。 首先是crontab的执行频率问题。如果没有接触过crontab可能会有些陌生。 crontab命令包含6个参数,命令的一些基本说明如下:

* *   *  *  *  command  分  时  日  月  周  命令

  第1列表示分钟1~59 每分钟用*或者 */1表示   第2列表示小时1~23(0表示0点)   第3列表示日期1~31   第4列表示月份1~12   第5列标识号星期0~6(0表示星期天)   第6列要运行的命令

在这个例子中。0,30是第一个参数,就代表每个小时的0分,30分执行一次下面的脚本。 0,30 * * * * /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log 如果要求脚本在指定的时间段,比如只在5分,20分,30分的时候执行, 5,20,30 * * * * /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log

如果要求脚本在指定的时间段,比如只在每天晚上的11:30执行,就可以写成下面的形式。

30 23 * * * /opt/app/oracle/xxxxxx/Script/DailyChk/chk_path_full.ksh PRODB 2>&1 >/opt/app/oracle/Script/DailyLog/chk_path_full.log

从配置来看,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

得到了这些基本信息,就能够基本确定问题了。 至于crontab的修改,可以使用crontab -e来完成。感觉就跟vi操作一样。客户做了确认之后,手工kill掉了那个job,那个问题就解决了。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r3笔记100天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-12-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 字符画,你可能未知的美 (76天)

    在平时的工作中,如果接触字符界面时间比较长的时候,都会无意识的感觉到单调,认为字符只能表达一些抽象复杂的东西,对于图形的那种简单和清晰,显得有些力不从心。 今天...

    jeanron100
  • 关于查看dba_data_files的一个小问题(r7笔记第72天)

    今天帮一个朋友看一个pl/sql的问题,他已经钻到一个死胡同里列,可能明眼人一看就知道哪里有问题,但是当局者迷,所以我抽空看了一下这个pl/sql块。 pl/s...

    jeanron100
  • 闪回数据库不是“万金油”(r11笔记第73天)

    闪回数据库这个特性在很多Oracle DBA眼里就是鸡肋特性,因为谁会因为恢复数据而需要在主库闪回,最后可能丢掉更多的数据,这个观点没错。 但是...

    jeanron100
  • idea代码简化神器:Lombok

    相信大家都有这样的经历,编写完一个实体类后,为这个实体类的每个属性添加setter和getter,当给类增加一个属性时,又要去给这个属性添加sett...

    小诸葛
  • SpringAop切面实现日志记录

    SpringAop切面实现日志记录 代码实现:https://www.cnblogs.com/wenjunwei/p/9639909.html

    用户1518699
  • 一日一技:使用异或操作对数字进行加密解密

    假设密钥为88882222,QQ密码为4455661122,那么可以使用密钥对QQ密码进行加密:

    青南
  • H3C设备之ARP代理

             proxy-arp enable                         开启ARP代理功能

    py3study
  • Kotlin 使用 Anko 构建布局的那些事

    毕竟以往的布局都是要从 XML 中解析出来,然后再到 LayoutInfalter 里面通过 Constructor.newInstance 反射创建出来的。而...

    glumes
  • 合并两个有序链表

    合并两个有序链表,使得合并后的结果仍然是有序的,直观的做法就是从两个链表的首节点开始比较,将其中小的那个链接到新链表之中,(如果不想破坏原链表,那么需要将该节点...

    zy010101
  • hashMap的循环姿势你真的使用对了吗?

    hashMap 应该是java程序员工作中用的比较多的一个键值对处理的数据的类型了。这种数据类型一般都会有增删查的方法,今天我们就来看看它的循环方法以前写过一篇...

    java金融

扫码关注云+社区

领取腾讯云代金券