• Siebel Component 定时重启


    热度:

    项目中某个组件经常性出问题,重启下便好了。所以写个脚本每天跑一下重启组件。并且监控组件状态,如果启动失败,自动发送通知邮件到指定邮箱。

    1. 在Linux系统上使用crontab 命令定时(循环)执行某个任务的程序

        crontab -l  //列出某个用户cron服务的详细内容

        crontab filename //根据文本内容设定定时作业

        这里我新建一个cron.txt ,    内容为   01 2 * * * /home/oracle/cron/comp_sfs.sh

        然后执行 crontab cron.txt,任务会被自动加载,因为Cron服务会每隔一分钟Check所有的任务。

    2. 编写重启脚本 comp_sfs.sh

        Siebel 提供了服务器组件、任务、会话管理命令行接口,(Siebel Component Manage Command Line Interface),并提供了 /b 等批处理参数,执行批处理时可以将输入的命令全部保存到文件,从文件加载命令,如果要使用awk获取命令执行后返回的组件状态,则必须定制返回结果的显示列,使用 configure list comp show column1,column2,column3,……,这里我只定制输出了当前运行的用户数,运行状态,组件别名等不包含空格的列(awk输出是用空格做分隔符)。捕获状态后根据状态值确定组件是否正常,正常启动的状态应该为 Online 或 “在线”,如是其他状态则发送通知邮件。

    #!/bin/sh
    
    
    
    logfile=/home/oracle/cron/component.log
    
    command=$1
    
    cp=$2
    
    tempfile=command.txt
    
    defaultcomp=SFSObjMgr_chs
    
    defaultcmd=restart
    
    srvrcmd="srvrmgr /g crmtst /s crmtst /e TEST /u SADMIN2 /p SADMIN2 "
    
    envpath=". /oracle/app/siebel/siebsrvr/siebenv.sh"
    
    configlist="configure list comp show CC_ALIAS,CP_DISP_RUN_STATE,CP_NUM_RUN_TASKS,CP_MAX_TASKS,CP_ACTV_MTS_PROCS,CP_MAX_MTS_PROCS "
    
    notifyprogram="python /home/oracle/cron/YEmail.py"
    
    
    
    if [ "${command}" == "" ]
    
    then
    
            command=${defaultcmd}
    
    fi
    
    
    
    if [ "${cp}" == "" ]
    
    then
    
            cp=${defaultcomp}
    
    fi
    
    
    
    ${envpath}
    
    
    
    echo -e ${configlist} > $tempfile
    
    echo list comp ${cp} >> $tempfile
    
    preusers=`${srvrcmd} /b /i $tempfile | grep $cp |  grep -v "srvrmgr" | awk '{ print $3 }'`
    
    
    
    echo -e "#---------------------- Component Operate ------------------------#" >> ${logfile}
    
    if [ "${command}" == "restart" ]
    
    then
    
    
    
        echo Load Component: ${cp}  >> ${logfile}
    
        echo Operate Action: ${command}  >> ${logfile}
    
        echo Kill Component ${cp} ... >> ${logfile}
    
        ${srvrcmd} /b /c "kill comp ${cp}" | grep ${cp} | grep -v "srvrmgr"
    
        sleep 2
    
        echo Start Component ${cp} ... >> ${logfile}
    
        ${srvrcmd} /b /c "startup comp ${cp}" | grep ${cp} | grep -v "srvrmgr"
    
    else
    
        echo ${command} Component ${cp} ... >> ${logfile}
    
        ${srvrcmd} /b /c "${command} comp ${cp}" | grep ${cp} | grep -v "srvrmgr"
    
    
    
        sleep 1
    
    fi
    
    
    
    res=`${srvrcmd} /b /i $tempfile | grep $cp |  grep -v "srvrmgr" `
    
    
    
    status=`echo $res | awk '{ print $2 }'`
    
    
    
    echo Check Componnet Status: ${status} >> ${logfile}
    
    
    
    if [ "${status}" != "Online" -a "${status}" != "运行中" ]
    
    then
    
      ${notifyprogram}
    
      echo Server Component Not Runing Normal ,Email Sent
    
    fi
    
    
    
    
    
    echo Check Componnet Status: ${status} >> ${logfile}
    
    
    
    echo Before Operate Running User Number: ${preusers} >> ${logfile}
    
    echo Operate DateTime: $(date +"%Y/%m/%d %T") >> ${logfile}
    
    echo -e "#---------------------------  End  -------------------------------#\n"  >> ${logfile}
    
    
    
    rm $tempfile
    
    
    

    3. 邮件通知程序

       linux本身是支持发送邮件的,有相关命令,但前面我写过一个python 发送邮件的脚本,就用现成的了。

    # -*- coding: gbk -*-
    
    '''
    
    Created on 2011-1-27
    
    
    
    @author: Spring
    
    '''
    
    
    
    import email
    
    import mimetypes
    
    import random
    
    import time
    
    from datetime import datetime
    
    import string
    
    from email.MIMEMultipart import MIMEMultipart
    
    from email.MIMEText import MIMEText
    
    from email.MIMEImage import MIMEImage
    
    import smtplib
    
    
    
    class YEmail(object):
    
        '''
    
        classdocs
    
        '''
    
    
    
        def __init__(self, configProfile):
    
            self.authInfo = configProfile.get("EMAIL")
    
            if not self.authInfo:
    
                raise "请为配置文件添加SSH模块,参数见文档"
    
    
    
            self.fromAdd = self.authInfo["admin_email"]
    
            self.subject = self.authInfo["admin_subject"]
    
            self.mailContentFile = self.authInfo["content_file"]
    
            self.email_file = self.authInfo["addrs_file"]
    
            self.isLog = bool(self.authInfo.get("enable_log"))
    
            self.log_file_path = self.authInfo["log_file_path"]
    
            self.isHtml = self.authInfo["content_type"]
    
            self.default_admin=self.authInfo.get("admin_name")
    
            self.currentMsg = ""
    
    
    
        def enableLog(self):
    
            '''
    
                Enable Log,Create Log File
    
            '''
    
            self.isLog = True
    
            self.log_file = open(self.log_file_path, 'a')
    
    
    
        def logger(self, msg):
    
            '''
    
                Log Recorder
    
            '''
    
            if self.isLog:
    
                if not self.log_file:
    
                    self.log_file = open(self.log_file_path, 'a')
    
                self.log_file.write(datetime.now().strftime("%Y/%m/%d %H:%M:%S%p") + "  ## "+ 
    
    msg + "\n\n")
    
    
    
            self.currentMsg = msg
    
            print msg + "\n\n"
    
    
    
    
    
        def sendEmail(self, fromAdd, toAdd, subject, content, isHtml):
    
            '''
    
                Send Mail,  param is Sender,Receivers,Subject , Content, is or not HTML
    
            '''
    
            strFrom = fromAdd
    
            strTo = toAdd.replace(",", ";")
    
            listTo = strTo.split(";")
    
    
    
            server = self.authInfo.get('smtp_server')
    
            user = self.authInfo.get('user')
    
            passwd = self.authInfo.get('password')
    
    
    
            if not (server and user and passwd) :
    
                    self.logger('邮件配置信息错误,登陆邮件服务器失败~!')
    
                    return False
    
    
    
            # 设定root信息
    
            msgRoot = MIMEMultipart('related')
    
            msgRoot['Subject'] = subject
    
            msgRoot['From'] = strFrom
    
            msgRoot['To'] = ', '.join(listTo)
    
    
    
            # Encapsulate the plain and HTML versions of the message body in an
    
            # 'alternative' part, so message agents can decide which they want to display.     
    
    
    
            msgAlternative = MIMEMultipart('alternative')
    
            msgRoot.attach(msgAlternative)
    
    
    
            #设定纯文本信息
    
            if isHtml == False :
    
                msgText = MIMEText(content, 'plain', 'gbk')
    
                msgAlternative.attach(msgText)
    
            else:
    
                #设定HTML信息
    
                msgText = MIMEText(content, 'html', 'gbk')
    
                msgAlternative.attach(msgText)
    
    
    
            #设定内置图片信息
    
            #fp = open('1.jpg', 'rb')
    
            #msgImage = MIMEImage(fp.read())
    
            #fp.close()
    
            #msgImage.add_header('Content-ID', '<image1>')
    
            #msgRoot.attach(msgImage)
    
    
    
           #发送邮件
    
            smtp = smtplib.SMTP()
    
           #设定调试级别,依情况而定
    
            smtp.set_debuglevel(1)
    
            smtp.connect(server)
    
            smtp.login(user, passwd)
    
            smtp.sendmail(strFrom, listTo, msgRoot.as_string())
    
            return   True
    
    
    
        def getBody(self):
    
            '''
    
                Get Email Body from file,Can be html ,or plain text
    
            '''
    
            f_body = open(self.mailContentFile, 'r')
    
            plainText = f_body.read()
    
            f_body.close()
    
            return plainText
    
    
    
        def getContacts(self):
    
            '''
    
                Get Contacts's Info ,and email address, split by ',' ,First is User ID or 
    
    Name,
    
                others is eamil address
    
            '''
    
    
    
            contacts = []
    
            try:
    
                f_contacts = open(self.email_file, "r")
    
                commentLine = 0
    
                for line in f_contacts:
    
                    if line[0] == "#":
    
                        commentLine = commentLine + 1
    
                        continue
    
                    if line[-1] != '\n':
    
                        line = line + "\n"
    
                    try:
    
                        contact = {}
    
                        contact["name"] = line.split(',')[0]
    
                        contact["email"] = line[line.index(',') + 1:-1]
    
                        self.logger("联系人: " + contact["name"] + ", 地址  " + 
    
    contact["email"])
    
                        contacts.append(contact)
    
                    except :
    
                        self.logger("行: " + line + "  ------- 出现异常")
    
                        continue
    
                f_contacts.close()
    
                self.logger("注释行 :" + str(commentLine))
    
                self.logger("有效行 :" + str(len(contacts)))
    
                self.logger("/*------------------- 联系人地址识别结束 --------------------*/")
    
            except Exception:
    
                contacts.append({"name":self.default_admin,
    
                                "email":self.fromAdd
    
                                 })
    
            return  contacts
    
    
    
        def multiSend(self,dictargs={}):
    
            '''
    
                More than one contact email address,but every people will receive single .
    
                dict args are "arg":"value" dictionary ,instead of @[arg] to value in content 
    
    file
    
            '''
    
            self.enableLog()
    
            self.logger("/*==================== 根据联系人列表发送邮件 
    
    
    =====================*/")
    
            try:
    
                #邮件内容
    
                htmlText = self.getBody()
    
                #收信人邮件地址列表
    
                contacts = self.getContacts()
    
            except Exception:
    
                raise "联系人列表和邮件内容模板路径错误!"
    
    
    
            #记录发送进度
    
            self.logger("/*------------------- 开始发送邮件 --------------------*/")
    
            i = 0
    
            j = 0
    
            for line in contacts:
    
              try:
    
                addr = str(line["email"])
    
                contact = str(line["name"])
    
                htmlText = htmlText.replace("[@Name]",contact)
    
                for args in dictargs.keys():
    
                    htmlText = htmlText.replace("[@%s]" % args, dictargs[args])
    
                self.sendEmail(self.fromAdd, addr, self.subject, htmlText, self.isHtml)
    
                self.logger(str(i + 1) + "\t" + contact + "\t" + addr + '  ------------ ' + 
    
    'OK.')
    
                i = i + 1
    
              except Exception:
    
                j = j + 1
    
                self.logger(str(i + 1) + "\t" + contact + "\t" + addr + '  ------------ ' + 
    
    'Error.')
    
                raise
    
                continue
    
    
    
            self.logger("成功发送 " + str(i) + " 个联系人,失败 " + str(j) + " .")
    
            self.closeLog()
    
    
    
        def closeLog(self):
    
            '''
    
                close log
    
            '''
    
            if self.log_file and not self.log_file.closed:
    
                self.log_file.close()
    
    
    
    
    
    
    
    if __name__ == "__main__":
    
        #用于测试
    
        configProfile = {"email":{
    
                                    "smtp_server":"10.192.224.16",
    
                                    "user":'out-luchunlong@cn.panasonic.com' ,
    
                                    "password":'ysisl11#' ,
    
                                    "content_file":"body.txt",
    
                                    "addrs_file" : 'addrs.txt',
    
                                    "enable_log":False,
    
                                    "log_file_path":"email_log.txt",
    
                                    "content_type":"html",
    
                                    "admin_email":"Manager <out-luchunlong@cn.panasonic.com>",
    
                                    "admin_subject":"系统维护监控程序异常通知邮件"
    
                                }
    
                        }
    
        #Config 引擎测试
    
        from YConfig import YConfig
    
        cfg = YConfig()
    
        configProfile = cfg.cfgdict
    
    
    
        m = YEmail(configProfile)
    
        dictargs = {
    
                     "Content" : "组件启动失败",
    
                     "date" : datetime.now().strftime("%Y-%m-%d %H:%M:%S%p")
    
                    }
    
        m.multiSend(dictargs)
    
    
    
    
    
  • 相关阅读:
    大佬讲话听后感
    P1226快速幂取余
    对拍
    P1017 进制转换
    P1092 虫食算 NOIP2002
    P1003 铺地毯
    P1443 马的遍历
    P1032 字串变换
    P1379 八数码问题
    2-MAVEN 基本命令
  • 原文地址:https://www.cnblogs.com/ysisl/p/2184977.html
Copyright © 2020-2023  润新知