*/5 * * * * /usr/bin/flock -xn /tmp/mq_cmonitor.lock -c 'sh /data/mq_comsumer_monitor.sh >> /data/daas_sh/mq_cmonitor.log'
分隔日志 logrotate -f /etc/logrotate.d/mq_comsumer_monitor
/etc/logrotate.d /mq_comsumer_monitor
/data/location_sh/*.log {
daily
dateext
rotate 7
compress
create 640 root root
sharedscripts
}
#!/bin/bash
# file name : mq_comsumer_monitor.sh
# function : 监控rabbitmq 某个消费队列,没有消费者则
# notes : 1.脚本运行环境在启动java进程所在的服务器上;
# 2.通过ssh链接获取队列消费者信息
# 3.crontab执行时需要加独占锁,因脚本中有耗时操作,防止多个一起执行
# date : 18/12/4
# author : summer
#监控的队列
monitor_quenue_name="xxxxTask"
#日志数据文件
data_path="$(cd $(dirname ${0}); pwd)/mq_comsumer_monitor.data"
#每天最大可启次数
max_reload_times="12"
#小于等于水位线,则需要重启
water_line="0"
#rabbitmq地址
mq_addr="root@10.31.192.37"
mq_pwd="XXXX"
#打印日志
print_log(){
echo "$(date +"%Y-%m-%d %T"):${1}"
}
#生成新的记录,文件不存在则新建一个初值为0的记录
create_new_data(){
if [[ ! -f "${data_path}" ]];
then
echo "$(date +"%Y-%m-%d %H/%M/%S");0" > ${data_path}
fi
if [[ -n ${1} ]];
then
echo "$(date +"%Y-%m-%d %H/%M/%S");${1}" >> ${data_path}
fi
}
#重新启动java进程
reload_java_proc(){
print_log "reloading..."
/data/daasdocker/docker-compose -f docker-compose185.yml rm -s -f webapp8080
print_log "stop old webapp8080..."
sleep 10
/data/daasdocker/docker-compose -f docker-compose185.yml up -d webapp8080
print_log "reload new webapp8080..."
sleep 10
print_log "reload finshed"
}
#查询远程mq队列
search_queueCustomers_nums(){
queue_name=${1}
#本次执行是今天第几次
this_times=$(expr ${2} + 1)
print_log "====1=queue_name:${queue_name},this_times:${this_times}"
#numbers=$(rabbitmqctl list_consumers | grep "${queue_name}" | awk '{print $5}')
customer_info=$(sshpass -p ${mq_pwd} ssh ${mq_addr} "rabbitmqctl list_consumers | grep ${queue_name} ")
print_log "customer_info:${customer_info}"
numbers=$(echo "${customer_info}" | awk '{print $5}')
if [[ -n ${numbers} ]];
then
print_log "${monitor_quenue_name}:customers numbers:${numbers}"
if [[ ${numbers} -eq ${water_line} ]];
then
#重启
reload_java_proc
create_new_data "${this_times}"
else
#不需要重启
print_log "not need reload..."
fi
else
echo "is null ${numbers}"
#重启
reload_java_proc
create_new_data "${this_times}"
fi
}
#主体
main_body(){
now_date=$(date +"%Y-%m-%d")
#获取年月日
last_date=$(sed -n '$p' ${data_path} |cut -d" " -f1)
#获取次数
last_times=$(sed -n '$p' ${data_path} |cut -d";" -f2)
if [[ ${now_date} -eq ${last_date} ]];
then
print_log "相等====now:${now_date}===last:${last_date}"
#小于设置的每天最多重启次数则可以重启
if [[ ${last_times} -le ${max_reload_times} ]];
then
search_queueCustomers_nums "${monitor_quenue_name}" "${last_times}"
else
print_log "excess max reload times,last_times:${last_times}"
fi
else
print_log "不相等====now:${now_date}===last:${last_date}"
#插入一条记录
create_new_data "0"
fi
}
#创建一个记录
echo "Begin:"$$
create_new_data
main_body
echo "finsh:"$$