#!/bin/sh
#程序目的:判断TIM主机上组织同步脚本和人员同步脚本的运行情况,若不正常则自动启动应用;并短信告知状态。
#若检测出后台2进程失踪,则重新启动该进程并发短信通知管理员
#编写时间:2015-09-16 兰子洲 13071039067
#部署策略:TIM主机为HA架构,脚本部署在两台主机,定时任务执行
#模块0:核心函数,判断人员和组织进程的的运行情况
monitorOrgSync()
{
#如果主机有文件系统/ldapdata,则开始监控
#设置组织同步脚本后台进程的关键字
keyWord=orgSyncLine
haIsMaster /ldapdata
isHa=$?
if [ isHa -eq 1 ]
then
psNumKeyWord ${keyWord}
psNumOrg=$?
if [ ${psNumOrg} -le 0 ]
then
ERRMSG="TIM系统监控:组织同步进程失效;将10秒后自动重启组织同步脚本!"
sleepTime="sleep 10"
sendMsg="send_msg"
#varPar="java /ldapdata/idi/classes/OrgSyncStop" --这个脚本是在restart上看到的,觉着没有用,先注释掉
startOrg="./ldapdata/idi/bin/startOrg.sh"
judge "${sendMsg}" "${sleepTime}" "${varPar}" "${startOrg}"
#10秒钟如果进程正常,发送进程已经正常的短信
sleep 10
ERRMSG="TIM系统监控:组织同步进程已经恢复正常. ^-^"
psNumKeyWord ${keyWord}
psNumOrgAnother=$?
if [ ${psNumOrgAnother} -gt "0" ]
then
send_msg
fi
else
echo "TIM系统监控:组织同步进程正常。"
fi
else
echo "The Host is not master."
fi
}
monitorPersonSync()
{
#如果主机有文件系统/ldapdata,则开始监控
#定义人员同步脚本后台进程的关键字
keyWord=haPersonEventhandler
haIsMaster /ldapdata
isHa=$?
if [ ${isHa} -eq 1 ]
then
psNumKeyWord ${keyWord}
psNumPerson=$?
if [ ${psNumPerson} -le "0" ]
then
ERRMSG="TIM系统监控:人员同步进程失效;将10秒后自动重启人员同步脚本!"
sleepTime="sleep 10"
sendMsg="send_msg"
startPerson="./ldapdata/idi/bin/startPerson.sh"
judge "${sendMsg}" "${sleepTime}" "${startPerson}"
#10秒钟如果进程正常,发送进程已经正常的短信
sleep 10
ERRMSG="TIM系统监控:人员同步进程已经恢复正常. ^-^"
psNumKeyWord keyWord
psNumPersonAnother=$?
if [ ${psNumPersonAnother} -gt "0" ]
then
send_msg
fi
else
echo "TIM系统监控:人员同步进程正常。"
fi
else
echo "The Host is not master."
fi
}
#模块1:判断HA状态(是否为master状态)
#传入参数:共享文件系统名
#返回值:1是主状态,0是从状态,2表示程序输出错误
haIsMaster()
{
#fsName:传入的共享文件系统名字
fsName=$1
tmpNum=`df | grep ${fsName} | grep -v grep | wc -l`
if [ ${tmpNum} -gt 1 ]
then echo "关键字${fsName},请检查传递的参数,关键字在文件系统中不止一个!"
return 2
elif [ ${tmpNum} -eq 1 ]
then echo "关键字${fsName},系统中存在该文件系统且只有一个。"
return 1
elif [ ${tmpNum} -eq 0 ]
then echo "关键字${fsName},系统中不存在该文件系统."
return 0
fi
}
#模块2:用关键字判断进程的数量
#传入参数:用关键字表示的进程名
#返回值:进程的数量
psNumKeyWord()
{
#keyWord:进程名关键字
keyWord=$1
keyWordNum=`ps -ef | grep ${keyWord} | grep -v grep | wc -l`
return ${keyWordNum}
}
#模块3:执行多个脚本或任务
judge()
{
echo ""
echo "Programs starting..."
echo "There are $# Apps need to be done."
#定义日志文件,用日期表示
Time=`date "+%Y%m%d"`
dir=/opt/script/
#logFile=${dir}${Time}_run_para.log
#从传入的参数开始执行
for p in "$@"
do
#如果存在日志文件,则在日志文件中追加
if [ -f ${logFile} ]
then
$p >> ${logFile} 2>&1
if [ $? -eq 0 ]
then
Log_Words="----------------The [ $p ] is OK! At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
echo ${Log_Words}
else
Log_Words="XXXXXXXXXXXXXXXX The [ $p ] is fail! At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
echo ${Log_Words}
break
fi
#如果不存在日志文件,则创建日志文件
else
$p > ${logFile} 2>&1
if [ $? -eq 0 ]
then
Log_Words="----------------The [ $p ] is OK! At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
echo ${Log_Words}
else
Log_Words="XXXXXXXXXXXXXXXXThe [ $p ] is fail! At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
echo ${Log_Words}
break
fi
fi
done
}
#模块4:发送错误短信提醒
send_msg()
{
#PHONE=/home/monitor/sms_phone_number
PHONE=/home/monitor/lion.sms
for number in `cat $PHONE`
do
java -cp /home/monitor/com.jar:/home/monitor SendShortMsg $number "`hostname` $ERRMSG $LOG_TIME"
done
}
monitorOrgSync
monitorPersonSync
#程序目的:判断TIM主机上组织同步脚本和人员同步脚本的运行情况,若不正常则自动启动应用;并短信告知状态。
#若检测出后台2进程失踪,则重新启动该进程并发短信通知管理员
#编写时间:2015-09-16 兰子洲 13071039067
#部署策略:TIM主机为HA架构,脚本部署在两台主机,定时任务执行
#模块0:核心函数,判断人员和组织进程的的运行情况
monitorOrgSync()
{
#如果主机有文件系统/ldapdata,则开始监控
#设置组织同步脚本后台进程的关键字
keyWord=orgSyncLine
haIsMaster /ldapdata
isHa=$?
if [ isHa -eq 1 ]
then
psNumKeyWord ${keyWord}
psNumOrg=$?
if [ ${psNumOrg} -le 0 ]
then
ERRMSG="TIM系统监控:组织同步进程失效;将10秒后自动重启组织同步脚本!"
sleepTime="sleep 10"
sendMsg="send_msg"
#varPar="java /ldapdata/idi/classes/OrgSyncStop" --这个脚本是在restart上看到的,觉着没有用,先注释掉
startOrg="./ldapdata/idi/bin/startOrg.sh"
judge "${sendMsg}" "${sleepTime}" "${varPar}" "${startOrg}"
#10秒钟如果进程正常,发送进程已经正常的短信
sleep 10
ERRMSG="TIM系统监控:组织同步进程已经恢复正常. ^-^"
psNumKeyWord ${keyWord}
psNumOrgAnother=$?
if [ ${psNumOrgAnother} -gt "0" ]
then
send_msg
fi
else
echo "TIM系统监控:组织同步进程正常。"
fi
else
echo "The Host is not master."
fi
}
monitorPersonSync()
{
#如果主机有文件系统/ldapdata,则开始监控
#定义人员同步脚本后台进程的关键字
keyWord=haPersonEventhandler
haIsMaster /ldapdata
isHa=$?
if [ ${isHa} -eq 1 ]
then
psNumKeyWord ${keyWord}
psNumPerson=$?
if [ ${psNumPerson} -le "0" ]
then
ERRMSG="TIM系统监控:人员同步进程失效;将10秒后自动重启人员同步脚本!"
sleepTime="sleep 10"
sendMsg="send_msg"
startPerson="./ldapdata/idi/bin/startPerson.sh"
judge "${sendMsg}" "${sleepTime}" "${startPerson}"
#10秒钟如果进程正常,发送进程已经正常的短信
sleep 10
ERRMSG="TIM系统监控:人员同步进程已经恢复正常. ^-^"
psNumKeyWord keyWord
psNumPersonAnother=$?
if [ ${psNumPersonAnother} -gt "0" ]
then
send_msg
fi
else
echo "TIM系统监控:人员同步进程正常。"
fi
else
echo "The Host is not master."
fi
}
#模块1:判断HA状态(是否为master状态)
#传入参数:共享文件系统名
#返回值:1是主状态,0是从状态,2表示程序输出错误
haIsMaster()
{
#fsName:传入的共享文件系统名字
fsName=$1
tmpNum=`df | grep ${fsName} | grep -v grep | wc -l`
if [ ${tmpNum} -gt 1 ]
then echo "关键字${fsName},请检查传递的参数,关键字在文件系统中不止一个!"
return 2
elif [ ${tmpNum} -eq 1 ]
then echo "关键字${fsName},系统中存在该文件系统且只有一个。"
return 1
elif [ ${tmpNum} -eq 0 ]
then echo "关键字${fsName},系统中不存在该文件系统."
return 0
fi
}
#模块2:用关键字判断进程的数量
#传入参数:用关键字表示的进程名
#返回值:进程的数量
psNumKeyWord()
{
#keyWord:进程名关键字
keyWord=$1
keyWordNum=`ps -ef | grep ${keyWord} | grep -v grep | wc -l`
return ${keyWordNum}
}
#模块3:执行多个脚本或任务
judge()
{
echo ""
echo "Programs starting..."
echo "There are $# Apps need to be done."
#定义日志文件,用日期表示
Time=`date "+%Y%m%d"`
dir=/opt/script/
#logFile=${dir}${Time}_run_para.log
#从传入的参数开始执行
for p in "$@"
do
#如果存在日志文件,则在日志文件中追加
if [ -f ${logFile} ]
then
$p >> ${logFile} 2>&1
if [ $? -eq 0 ]
then
Log_Words="----------------The [ $p ] is OK! At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
echo ${Log_Words}
else
Log_Words="XXXXXXXXXXXXXXXX The [ $p ] is fail! At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
echo ${Log_Words}
break
fi
#如果不存在日志文件,则创建日志文件
else
$p > ${logFile} 2>&1
if [ $? -eq 0 ]
then
Log_Words="----------------The [ $p ] is OK! At:$(date +%Y.%m.%d_%H:%M:%S) ------------------"
echo ${Log_Words}
else
Log_Words="XXXXXXXXXXXXXXXXThe [ $p ] is fail! At:$(date +%Y.%m.%d_%H:%M:%S) XXXXXXXXXXXXXXXXXX"
echo ${Log_Words}
break
fi
fi
done
}
#模块4:发送错误短信提醒
send_msg()
{
#PHONE=/home/monitor/sms_phone_number
PHONE=/home/monitor/lion.sms
for number in `cat $PHONE`
do
java -cp /home/monitor/com.jar:/home/monitor SendShortMsg $number "`hostname` $ERRMSG $LOG_TIME"
done
}
monitorOrgSync
monitorPersonSync