Siebel Component 定时重启

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

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

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)
 
 
 
目录
相关文章
|
5天前
|
SQL Java 调度
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
|
8月前
|
Linux Shell 网络安全
服务停止后,自启动的service怎么写
当服务停止后,你可以通过在特定目录中创建一个.service文件来实现自启动。下面是一个示例: 1. 打开终端或者SSH连接到CentOS服务器上。 2. 进入`/etc/systemd/system/`目录。这是存放系统服务的位置,你可以将你的自启动服务文件放在这里。 3. 使用文本编辑器(如vi或nano)创建一个新的.service文件,文件名可以是任意的以`.service`结尾。 ```bash sudo vi myservice.service ``` 在文件中添加以下内容: ``` [Unit] Description=My
|
11月前
|
API Android开发
使用Android的Service实现后台定时检测并重启应用
使用Android的Service实现后台定时检测并重启应用
|
Web App开发 缓存 JavaScript
service work 关于更新用户本地缓存的方案
service work + cache 可以用来对网站的一些资源进行本地缓存,甚至可以实现离线访问的功能(如果你的网站是纯静态的)。
144 0
 service work 关于更新用户本地缓存的方案
|
算法 Android开发
Android Service重启恢复(Service进程重启)原理解析(二)
Android Service重启恢复(Service进程重启)原理解析(二)
1315 0
Android Service重启恢复(Service进程重启)原理解析(二)
|
存储 Android开发
Android Service重启恢复(Service进程重启)原理解析(一)
Android Service重启恢复(Service进程重启)原理解析(一)
940 0
Android Service重启恢复(Service进程重启)原理解析(一)
|
XML 数据格式
SAP OData service的执行是如何从Gateway系统转交到backend系统
SAP OData service的执行是如何从Gateway系统转交到backend系统
91 0
SAP OData service的执行是如何从Gateway系统转交到backend系统
|
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'错误提示,进不到图形界面。
2410 0