Shell: To delete listener log file contains text and xml format (自动清理监听日志)

张维照 2019-05-31
18
0 0
摘要:在hpux 11.31 环境中shell 中的if -eq 比对数值大小时,如果数值大小超过Integer 类型的上限时使用的是String的ASCII码值比对,容易出现错误判断。

问题描述

清理数据库监听日志的脚本

清理多个监听日志

清理文本和XML格式,自动判断

根据文本格式大小默认1GB

根据XML格式生成日期默认7天前

支持ORACLE用户同时安装DB 和GRID,listener in GRID HOME

机器名带域名

 

Tip: 在hpux 11.31 环境中shell 中的if -eq 比对数值大小时,如果数值大小超过Integer 类型的上限时使用的是String的ASCII码值比对,容易出现错误判断。


专家解答

#!/bin/sh

# file: lsnr_log_clear.sh
# author: weejar(anbob.com)
# date: 2017/2/7
# desc: automatic to wrap listener log if filesize bigger than xx
# version: 1.1
# note: to add crontab in listener owner 
#
# I tested 11g, AIX 6, HPUX IA 11.31, EXADATA LINUX


# update history
# 0.1 2016/1/4 created
# ...
# 0.6 fix bug hpux 11.31  filesize over interger 2147483647 , do not work
# 0.7 fix bug hpux listener two processes, exclude "-inherit" one
# 0.8 fix bug hpux listener shadow processes get listener name wroung
# 0.9 fix bug filesize float type compare issue, to integer
# 1.0 fix LSNRRUNNING 
# 1.1 fix not remove listener xml log file in GRID HOME

echo $0
echo  `date "+%Y-%m-%d %H:%M:%S"`
echo "To clear listener log file begin..."  

WorkDir="/tmp"
listeners="${WorkDir}/listeners"
lsnrcol5="${WorkDir}/lsnrcol5"

# unit Mb
FILESIZELIMIT=1024

# 0 not have xml, 1 have
XMLFLAG=0

# set env
if [[ -f ~/.profile ]]
then
. ~/.profile
fi

if [[ -f ~/.bash_profile ]]
then
. ~/.bash_profile
fi

if [[ ! -d $WorkDir ]]
then
   mkdir -p $WorkDir
fi

OSV=`uname -s`
echo "Current OS:${OSV}"

LSNRRUNNING=`ps -ef | grep tnslsnr | grep -v grep`
if [ -n "${LSNRRUNNING}" ]
then

# filter ppid is 1
  ps -ef | grep tnslsnr | grep -v grep | awk '$3==1 {print $5}' > ${lsnrcol5}
  
   if [ $? -ne 0 ]
    then
        echo "ERROR:  to create file ${lsnrcol5} faild!" 
        exit 90
   fi
  
# Get listener names
  for i in `cat ${lsnrcol5}`
  do
    case "${i}" in
      "Jan"|"Feb"|"Mar"|"Apr"|"May"|"Jun"|"Jul"|"Aug"|"Sep"|"Oct"|"Nov"|"Dec") 
         ps -ef | grep tnslsnr | grep -v grep | grep -v -i scan | awk '$3==1  {print $10}' > ${listeners}
         ;;
      *) ps -ef | grep tnslsnr | grep -v grep | grep -v -i scan | awk '{print $9}' > ${listeners}
         ;;
    esac
  done
  

  
  # Check user is listener owner
  if [ -s "${listeners}" ] 
  then
    LSNROWNER=`ps -ef | grep tnslsnr | grep -v grep | grep -v -i scan|head -n 1|awk '{print $1}'`
    echo "listener owner: ${LSNROWNER}"
    
    USERID=`/usr/bin/id -u -nr`
    if [ $? -ne 0 ]
    then
        echo "ERROR: unable to determine uid" 
        exit 99
    fi
    
    echo "current user: ${USERID}"
   
    if [ "${USERID}" != "${LSNROWNER}" ]
    then
       echo "ERROR: This script must be run as listener owner: ${LSNROWNER}"  
       exit 98
    fi
  fi
  
  
  if [ -s "${listeners}" ] 
  then
    for i in `cat ${listeners}|grep -v inherit`
    do
        echo " "
        echo "listener name: ${i}"
        
          # if lsnrctl ORACLE HOME NOT CURRENT, i.e. grid and oracle soft all use oracle user

         lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|head -n 1|awk '{ print $9 }'`
         if [[ "Linux" = "${OSV}" ]]
         then
             lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|awk '{ print $8 }'`
         fi
         if [[ "AIX" = "${OSV}" ]]
         then 
           lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|head -n 1|awk '{ print $9 }'`
         fi
         if [[ "HP-UX" = "${OSV}" ]]
         then 
           lsnrp=`ps -ef|grep tnslsnr|grep -v grep|grep "${i} "|awk '$3==1 {print $9 }'|head -n 1 `
         fi
         
         echo "Listener Home path: ${lsnrp} $lsnrp"
         
         if [ -n "${lsnrp}" ]
         then
          ORACLE_HOME=${lsnrp%/bin*}
         fi
         
         echo "oracle home: $ORACLE_HOME"

        
        lsnrlog=`${ORACLE_HOME}/bin/lsnrctl status ${i} | grep "Listener Log" | awk '{print $4}'`
        if [ ! -f "${lsnrlog}" ]
        then
          echo "${lsnrlog} does not exist"
          exit 1
        fi
        echo "listener log file: ${lsnrlog}"
        FILENAME=${lsnrlog##*/}
        echo  "listener filename: ${FILENAME}"
        FILEEXT=${FILENAME#*.}
        echo "listener file ext: ${FILEEXT}"
        
        
        if [[ "log" = "${FILEEXT}" ]]
         then 
             FILEPATH=`dirname ${lsnrlog}`
             echo "listener file path: ${FILEPATH}"
             FILESIZE=`ls -l ${lsnrlog}|awk '{ printf "%.0f", $5/1024/1024 }'`
             echo "listener file size(MB):${FILESIZE}"
             if [ ${FILESIZE} -gt ${FILESIZELIMIT} ];then
              echo "listener log is bigger than ${FILESIZELIMIT} MB"
              # cut listener log file
              
${ORACLE_HOME}/bin/lsnrctl <<EOF
set cur listener ${i}
set log_status off
exit
EOF
              
              echo "cd ${FILEPATH}"
              cd ${FILEPATH}
              echo "mv -f ${FILENAME} ${FILENAME}_old"
              mv -f ${FILENAME} ${FILENAME}_old
${ORACLE_HOME}/bin/lsnrctl <<EOF
set cur listener ${i}
set log_status on
exit
EOF
              echo "gzip -f ${FILENAME}_old"
              gzip -f ${FILENAME}_old
             else
               echo "listener log  is litter than ${FILESIZELIMIT} MB"
             fi
        fi
              
        if [[ "xml" = "$FILEEXT" ]]
         then 
             LOGTXT="`echo ${i}|tr 'A-Z' 'a-z'`.log"
             LOGTXTPATH=`dirname ${lsnrlog} |sed 's/alert$/trace/'`
             LOGTXTFILE="$LOGTXTPATH/$LOGTXT"
             echo "listener txt log file: ${LOGTXTFILE}"
             FILESIZE=`ls -l ${LOGTXTFILE}|awk '{ printf "%.0f", $5/1024/1024 }'`
             echo "listener file size(MB):${FILESIZE}"
             LOGXMLPATH=`dirname ${lsnrlog}`
             echo "listener xml log Home: ${LOGXMLPATH}"
         # curt txt file large than $FILESIZELIMIT
              if [ ${FILESIZE} -gt ${FILESIZELIMIT} ]
              then
                echo "listener log is bigger than ${FILESIZELIMIT} MB"
                  # cut listener log file
                  echo "mv -f ${LOGTXTFILE} ${LOGTXTFILE}_old "
                  mv -f ${LOGTXTFILE} ${LOGTXTFILE}_old
                  echo "cd ${LOGTXTPATH}"
                  cd ${LOGTXTPATH}
                  echo "gzip -f ${LOGTXT}_old"
                  gzip -f ${LOGTXT}_old
            else
               echo "listener log  is litter than ${FILESIZELIMIT} MB"
            fi
         # curt xml logfile longer than 7 days.
             echo "To remove listener file for xml format longer than 7 days..."
             cd $LOGXMLPATH
             find ./ -name "log*.xml" -mtime +7 -print -exec rm {} \;
         #set flag
          XMLFLAG=1    
        fi
    done
##    if [ ${XMLFLAG} -gt 0 ]
##    then
##  # remove listener file for xml format  longer than 7 days
##       HOSTNAME=`hostname`
##  shortname=${HOSTNAME%%.*}                   
##  echo "To remove listener file for xml format longer than 7 days..."
##  cd $ORACLE_BASE/diag/tnslsnr/${shortname}
##  # print deleted
##     find ./ -name "log*.xml" -mtime +7 -print -exec rm {} \;
## fi
  fi
else
  printf "Unable to swap listener log files - Listener down\n"
  echo "${HOST} Unable to swap listener log files - Listener down" 
fi

echo  `date "+%Y-%m-%d %H:%M:%S"`
echo "To clear listener log file complated!"  
echo  ""
echo  ""


「喜欢文章,快来给作者赞赏墨值吧」

评论

0
0
Oracle
订阅
欢迎订阅Oracle频道,订阅之后可以获取最新资讯和更新通知。
墨值排行
今日本周综合
近期活动
全部
相关课程
全部