免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2031 | 回复: 6
打印 上一主题 下一主题

shell脚本交流区 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-28 09:55 |只看该作者 |倒序浏览
大家好,平时写了不少shell,渐渐的对编程的套路麻木了,很缺少创新。

哪位大侠可不可以把自己写的和我的交流一下,
我的邮箱是cion@163.com,发给我之后,我会回复我的shell。

谢谢。

[ 本帖最后由 Cion 于 2008-8-28 19:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-08-28 09:58 |只看该作者
浏览精华贴

有好帖子
建议贴出来
大家分享
也可提提意见

论坛徽章:
0
3 [报告]
发表于 2008-08-28 10:01 |只看该作者
先贴出我的代码,供大家评点。

  1. #!/bin/sh
  2. ###############################################################################
  3. # Program name: log_monitor.sh
  4. # Chinese name: 日志监控
  5. # Return value: 0, 成功; 1,参数检测失败
  6. # Author      :
  7. # Create date : 20070619
  8. # Modify date : 20070705
  9. #               新增日志监控类型域:ERROR或RUNNING,分别表示对日志报错的监控和
  10. #               对某关键字长久没有写入的监控
  11. ###############################################################################

  12. ################################### 配置项 ###################################
  13. # ##
  14. MONITOR_GROUP=1
  15. #注意相应修改下文的/usr/local/ORACLE_indb.profile引用

  16. # 监控类型##
  17. MONITOR_TYPE=2

  18. # 监控主机或数据库##
  19. MONITOR_MACHINE="##主机"
  20. ##############################################################################

  21. # 检测MONITOR_GROUP的合法性
  22. if [ L${MONITOR_GROUP}R = "LR" ]
  23. then
  24.     echo "ERROR:监控模块MONITOR_GROUP必须配置"
  25.     exit 1
  26. fi

  27. if [ ${MONITOR_GROUP} -ne 0 -a ${MONITOR_GROUP} -ne 1 -a ${MONITOR_GROUP} -ne 2 ]
  28. then
  29.     echo "ERROR:监控模块MONITOR_GROUP配置不合法:0, ##;1, ##;2, ###"
  30.     exit 1
  31. fi

  32. # 检测MONITOR_TYPE的合法性
  33. if [ L${MONITOR_TYPE}R = "LR" ]
  34. then
  35.     echo "ERROR:监控类型MONITOR_TYPE必须配置"
  36.     exit 1
  37. fi

  38. if [ ${MONITOR_TYPE} -ne 1 -a ${MONITOR_TYPE} -ne 2 -a ${MONITOR_TYPE} -ne 3 ]
  39. then
  40.     echo "ERROR:监控类型MONITOR_TYPE配置不合法:1, 主机目录积压; 2, 进程监控; 3, 数据库积压监控"
  41.     exit 1
  42. fi

  43. # 检测MONITOR_MACHINE的合法性
  44. if [ L${MONITOR_MACHINE}R = "LR" ]
  45. then
  46.     echo "ERROR:监控主机MONITOR_MACHINE必须配置"
  47.     exit 1
  48. fi

  49. MONITOR_DATE=$(date "+%Y%m%d[%H:%M:%S]")
  50. RUNNING_PATH=$(dirname $0)
  51. ERROR_MSG_LOG=${RUNNING_PATH}/log_monitor_error_msg.log
  52. LOG_CONFIG_FILE=${RUNNING_PATH}/log_monitor.ini
  53. touch $0

  54. #数据库环境变量的引入
  55. if [ -f /usr/local/ORACLE_bill.profile ];then
  56.     . /usr/local/ORACLE_bill.profile
  57. fi

  58. #引入系统环境变量
  59. if [ -f /usr/local/Runtime_32bit.profile ];then
  60.     . /usr/local/Runtime_32bit.profile
  61. fi

  62. # 报警函数
  63. # 用法:FUNC_ALARM 报错信息(不能包含空格)
  64. FUNC_ALARM()
  65. {
  66.     ALARM_MSG=$1
  67. #        sh ${RUNNING_PATH}/bf_alarm_p.sh ${MONITOR_MACHINE} ${MONITOR_TYPE} ${MONITOR_GROUP} ${ALARM_MSG} |
  68. #            tee -a $ERROR_MSG_LOG 2>&1
  69. #
  70. #        # 记录操作日志
  71. #        echo "sh ${RUNNING_PATH}/bf_alarm_p.sh ${MONITOR_MACHINE} ${MONITOR_TYPE} ${MONITOR_GROUP} ${ALARM_MSG}" |
  72. #            tee -a $ERROR_MSG_LOG

  73.     $EXECPROC_PATH/execproc $MONITOR_PATH/alarm ${MONITOR_MACHINE} ${MONITOR_TYPE} ${MONITOR_GROUP} ${ALARM_MSG} |
  74.         tee -a $ERROR_MSG_LOG

  75.     # 记录操作日志
  76.     echo $ALARM_MSG | tee -a $ERROR_MSG_LOG
  77. }


  78. ################################ 进程监控 ###############################
  79. # 日志文件大于10M,则备份日志文件
  80. if [ $(wc -c $ERROR_MSG_LOG|awk '{print $1}') -ge 10485760 ]
  81. then
  82.     mv $ERROR_MSG_LOG ${ERROR_MSG_LOG}.$(date "+%Y%m%d%H%M")
  83.     echo > $ERROR_MSG_LOG
  84.     export PATH=$PATH:/usr/contrib/bin/
  85.     gzip -f ${ERROR_MSG_LOG}*
  86. fi

  87. if [ ! -r $LOG_CONFIG_FILE ]
  88. then
  89.     echo "ERROR:${MONITOR_DATE}\n\t${LOG_CONFIG_FILE}配置文件不存在" | tee -a $ERROR_MSG_LOG
  90.     exit 1
  91. fi

  92. while read LOG_INFO
  93. do
  94.     # 参数检测
  95.     # 参数个数检测
  96.     FIELD_NUM=$(echo $LOG_INFO|awk -F"|" '{print NF}')
  97.     if [ $FIELD_NUM -lt 2 ]
  98.     then
  99.         FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t${LOG_INFO}不合法,请至少配置日志名关键字、日志监控识别关键字、日志说明和监控类型"
  100.         continue
  101.     fi

  102.     # 读取日志名称
  103.     LOG_NAME=$(echo $LOG_INFO|awk -F"|" '{print $1}')
  104.     if [ "L${LOG_NAME}R" = "LR" ]
  105.     then
  106.         FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t日志名称不可为空"
  107.         continue
  108.     fi

  109.     LOG_PATH=$(dirname ${LOG_NAME})
  110.     LOG_KEYWORD=$(basename ${LOG_NAME})

  111.     if [ ! -r ${LOG_PATH}/*${LOG_KEYWORD}* ]
  112.     then
  113.         FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t所监控的日志不存在"
  114.         continue
  115.     fi

  116.     DESCRIPT=$(echo $LOG_INFO|awk -F"|" '{print $3}')

  117.     # 检测监控类型的合法性
  118.     LOG_TYPE=$(echo $LOG_INFO|awk -F"|" '{print $4}')
  119.     if [ L${LOG_TYPE}R = LR ]
  120.     then
  121.         # 兼容前面版本,前面版本没有日志监控类型这个域
  122.         LOG_TYPE="ERROR"
  123.     fi

  124.     if [ ${LOG_TYPE} != "ERROR" -a ${LOG_TYPE} != "RUNNING" ]
  125.     then
  126.         FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t配置的日志监控类型应该为ERROR或者RUNNING"
  127.         continue
  128.     fi

  129.     # 日志监控检测
  130.     if [ ${LOG_TYPE} = "ERROR" ]
  131.     then
  132.         # 检测异常识别关键字的合法性
  133.         ERROR_KEYWORD=$(echo $LOG_INFO|awk -F"|" '{print $2}'|sed 's/,/|/g')
  134.         if [ L${ERROR_KEYWORD}R = LR ]
  135.         then
  136.             FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t配置的异常识别关键字不能为空"
  137.             continue
  138.         fi

  139.         # 判断日志中是否有异常
  140.         EXCEPTION_INFO=$(find ${LOG_PATH} -name *${LOG_KEYWORD}* -ctime 0 -exec cat {} \; |
  141.                        tail -n500 | grep -iE "${ERROR_KEYWORD}" | head -n1 | sed 's/[         ]/|/g')

  142.         if [ L${EXCEPTION_INFO}R != LR ]
  143.         then
  144.             FUNC_ALARM "ALARM:[${MONITOR_DATE}]${DESCRIPT}:发现异常${EXCEPTION_INFO};"
  145.         fi
  146.     elif [ ${LOG_TYPE} = "RUNNING" ]  # 监控阀值配置格式是: RUNNING_KEYWORD:mins
  147.     then
  148.         # 检测运行识别关键字的合法性
  149.         RUNNING_KEYWORD=$(echo $LOG_INFO|awk -F"|" '{print $2}'|awk -F: '{print $1}')
  150.         if [ L${RUNNING_KEYWORD}R = LR ]
  151.         then
  152.             FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t配置的运行识别关键字不能为空"
  153.             continue
  154.         fi

  155.         # 检测时间阀值的合法性
  156.         VALUE=$(echo $LOG_PATH|awk -F"|" '{print $2}'|awk -F: '{print $2}'|sed -n '/^[0-9].*$/p')
  157.         if [ L${VALUE}R = "LR" ]
  158.         then
  159.             FUNC_ALARM "ERROR:${MONITOR_DATE}\n\t${LOG_INFO}\n\t配置的监控阀值${VALUE}必须是自然数"
  160.             continue
  161.         fi

  162.         # 判断日志中是否对于某关键字没有写入的时间超过阀值
  163.         # 读取上次写入的时间,把时分分别赋值给LAST_HOUR,LAST_MIN
  164.         eval $(find ${LOG_PATH} -name *${LOG_KEYWORD}* -ctime 0 -exec cat {} \; |
  165.             tail -n5000 | grep -iE "${RUNNING_KEYWORD}" | tail -n1 |
  166.             awk -F: '{print "LAST_HOUR=" $1 ";" "LAST_MIN=" $2}')  # 日志该行须以:分隔前三个域分别表示时分秒

  167.         # 读取当前监控时间,把时分秒分别赋值给MONITOR_HOUR,MONITOR_MIN
  168.         eval $(date "+MONITOR_HOUR=%H;MONITOR_MIN=%M")

  169.         if [ "L${LAST_HOUR}R" = "LR" -a "L${LAST_MIN}R" = "LR" ]
  170.         then
  171.             FUNC_ALARM "ALARM:[${MONITOR_DATE}]${DESCRIPT}:哇塞!居然没有写日志!"
  172.             continue
  173.         fi

  174.         if [ ${MONITOR_HOUR} -lt ${LAST_HOUR} ]
  175.         then
  176.             # 处理跨1天的情况
  177.             MONITOR_HOUR=$(expr ${MONITOR_HOUR} + 1440 )
  178.         fi

  179.         # LAST_TOTAL_MIN=LAST_HOUR*60+LAST_MIN
  180.         eval $(echo | awk -v LAST_HOUR=$LAST_HOUR -v LAST_MIN=$LAST_MIN '
  181.             { print "LAST_TOTAL_MIN=" LAST_HOUR*60+LAST_MIN}')

  182.         # MONITOR_TOTAL_MIN=MONITOR_HOUR*60+MONITOR_MIN
  183.         eval $(echo | awk -v MONITOR_HOUR=$MONITOR_HOUR -v MONITOR_MIN=$MONITOR_MIN '
  184.             { print "MONITOR_TOTAL_MIN=" MONITOR_HOUR*60+MONITOR_MIN}')

  185.         INTERVAL_MIN=$(expr $MONITOR_TOTAL_MIN - $LAST_TOTAL_MIN)
  186.         if [ ${INTERVAL_MIN} -gt ${VALUE} ]
  187.         then
  188.             FUNC_ALARM "ALARM:[${MONITOR_DATE}]${DESCRIPT}:长达${INTERVAL_MIN}分钟没有有效运行,超出设定阀值${VALUE}"
  189.         fi
  190.     fi  # RUNNING
  191. done < $LOG_CONFIG_FILE

  192. exit 0

复制代码

[ 本帖最后由 Cion 于 2008-8-28 10:06 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-08-28 10:35 |只看该作者
大家可以把自己风格的shell,贴出来交流一下
呵呵。

论坛徽章:
0
5 [报告]
发表于 2008-08-28 11:34 |只看该作者
虽然没细看,但可以判断楼主shell编程功底很好,很强大!
尤其是shell 编程风格
大致一看,便知其大致作用
注释恰到好处
向楼主学习!
赞一个!!!

论坛徽章:
0
6 [报告]
发表于 2008-08-28 11:41 |只看该作者
来shell施教吧。

论坛徽章:
0
7 [报告]
发表于 2008-08-28 15:50 |只看该作者
原帖由 爱知 于 2008-8-28 11:34 发表
虽然没细看,但可以判断楼主shell编程功底很好,很强大!
尤其是shell 编程风格
大致一看,便知其大致作用
注释恰到好处
向楼主学习!
赞一个!!!

过奖过奖,我也是瞎想的,不知道别人都怎么写的,有什么好的意见建议,所以出来献丑交流。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP