Siebel Component 定时重启

简介: 热度:项目中某个组件经常性出问题,重启下便好了。所以写个脚本每天跑一下重启组件。并且监控组件状态,如果启动失败,自动发送通知邮件到指定邮箱。 1. 在Linux系统上使用crontab 命令定时(循环)执行某个任务的程序     crontab -l  //列出某个用户cro...
热度:

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

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)


目录
相关文章
|
3月前
|
Python
【Azure 应用服务】App Service的运行状况检查功能失效,一直提示"实例运行不正常"
【Azure 应用服务】App Service的运行状况检查功能失效,一直提示"实例运行不正常"
|
3月前
|
API 网络架构
【Azure 应用服务】如何定期自动重启 Azure App Service Plan(应用服务计划)
【Azure 应用服务】如何定期自动重启 Azure App Service Plan(应用服务计划)
|
3月前
|
Shell
【Azure 应用服务】App Service服务无法启动,打开Kudu站点,App Service Editor 页面均抛出:The service is unavailable
【Azure 应用服务】App Service服务无法启动,打开Kudu站点,App Service Editor 页面均抛出:The service is unavailable
|
6月前
|
SQL Java 调度
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
|
SQL 运维 Oracle
【大数据开发运维解决方案】记一次同事不慎用root起动weblogic以及启动日志卡在The server started in RUNNING mode 问题解决过程
最近因为单位换了新版本HD集群,有一些业务数据存在于hive数据库中。而有一些Smartbi的报表数据源是连接的华为HD Hive,因为变更了集群,需要将SmartBi的数据源改为新集群的。我将Kerberos认证凭据和新版本Hive jdbc驱动以及新的jdbc连接串给了同事,也将实施文档给了同事,但是同事在操作完成后,Smarbi节点无法正常起来(后台日志卡在:The server started in RUNNING mode,Server state changed to RUNNING),要么起来了就是无法联通Hive。
【大数据开发运维解决方案】记一次同事不慎用root起动weblogic以及启动日志卡在The server started in RUNNING mode 问题解决过程
|
Web App开发 缓存 JavaScript
service work 关于更新用户本地缓存的方案
service work + cache 可以用来对网站的一些资源进行本地缓存,甚至可以实现离线访问的功能(如果你的网站是纯静态的)。
170 0
 service work 关于更新用户本地缓存的方案
|
存储 Android开发
Android Service重启恢复(Service进程重启)原理解析(一)
Android Service重启恢复(Service进程重启)原理解析(一)
1042 0
Android Service重启恢复(Service进程重启)原理解析(一)
|
算法 Android开发
Android Service重启恢复(Service进程重启)原理解析(二)
Android Service重启恢复(Service进程重启)原理解析(二)
1591 0
Android Service重启恢复(Service进程重启)原理解析(二)
|
SQL XML 存储
MSSQL - 应用案例 - Event Notification + Service Broker构建死锁自动收集系统
--- title: MSSQL - 应用案例 - Event Notification + Service Broker构建死锁自动收集系统 author: 风移 --- # 摘要 这篇文章介绍SQL Server的一个典型的应用案例,即如何利用Event Notification与Service Broker技术相结合来实现死锁信息自动收集系统。通过这个系统,我们可以全面把控SQL
4712 0
|
Ubuntu Linux 虚拟化
VMWARE里启动kylin16.0时出现'SMBus Host Controller not enabled'(还未进入系统)
VMWARE里启动kylin16.0时出现'SMBus Host Controller not enabled'(还未进入系统) 在Vmware里安装完Ubuntu16.10,启动时出现'SMBus Host Controller not enabled'错误提示,进不到图形界面。
2648 0