目的:编写shell脚本来监控应用服务运行状态,若是应用异常则自动重启应用通过企业微信接收监控告警通知
知识要点:
- 使用shell脚本监控应用服务
- 使用shell脚本自动恢复异常服务
- 通过企业微信通知接收监控结果
- shell脚本使用数组知识,统计数据元素个数
- shell脚本使用变量叠加知识
- shell脚本使用算术知识
一、一键启停脚本
一键启停脚本目的是为了能够快速的批量查看服务器上运行的应用状态以及一键批量启动或者停止应用
#!/bin/bash
#一键启动、停止和查看云苍穹部分组件运行状态
#for app in mysqld zookeeper rabbitmq-server redis-6379 nginx mdd mservice mservice-qing mc fileserver kafka logstash zipkin es;do
apps=(zookeeper rabbitmq-server redis-6379 nginx mdd kafka logstash es)
# for app in zookeeper rabbitmq-server redis-6379 nginx mdd kafka logstash es ;do
for app in "${apps[@]}";do
case $1 in
start) systemctl start $app
;;
# 检查应用是否运行
status)
systemctl is-active $app 2>&1 >/dev/null # 引用正常运行会输出 active 字段,且返回结果为 0
if [ $? -eq 0 ];then
echo -e "\033[33m"
echo "$app" is running...
echo -e "\033[0m"
else
echo -e "\033[31m"
echo "$app is not running..."
echo -e "\033[0m"
fi
;;
stop) systemctl stop $app
;;
restart) systemctl stop $app;
sleep 1s;
systemctl start $app
## systemct status $app
;;
*) echo "usage $0 start|stop|status "
;;
esac
done
二、应用服务监控脚本
编写应用服务监控脚本,配置定时任务,定时监控应用,一旦检查到应用内运行异常则自动重启,并将结果通知发送到企业微信。
#!/bin/bash
# 使用前提: 所有应用服务器都配置 systemd
# 定时任务: */5 * * * * /local/monitorApp.sh 2>&1 /dev/null
# cat monitorApp.sh
# creator: @tudou
# date 2023-07-17
# 需要检查的应用列表,可自行修改素组内容/元素为需要监控的应用服务名
apps=(zookeeper rabbitmq-server redis-6379 nginx mdd kafka logstash es)
# apps=(docker jenkins nginx)
# 企业微信
function Weichat(){
# 请修改该为你的企业微信群组机器人
local webhook_key="你的企业微信秘钥"
# 发送get请求
curl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=$webhook_key" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\",\"text\": {\"content\": \"$$resultMessages\"}}"
}
# 应用异常才发送企业微信通知
function SendMessages(){
if [ -n "$messages" ] && [ "$restartCount" -gt 0 ];then
resultMessages=$messages
echo -e "$resultMessages" # 在控制台输出结果
# Weichat # 企业微信发送结果通知
fi
}
# 脚本监控动作
function AppAction(){
# 需要监控的应用名
#for app in mysqld zookeeper rabbitmq-server redis-6379 nginx mdd mservice mservice-qing mc fileserver kafka logstash zipkin es;do
# apps=(zookeeper rabbitmq-server redis-6379 nginx mdd kafka logstash es)
# 数组中元素的总数
count=${#apps[@]}
# 初始化应用异常数
errorCount=0
# 初始化应用正常数
successCount=0
# 初始化重启应用数
restartCount=0
# 初始化重启应用变量和结果变量
unset restartApp
unset messages
# 遍历所有应用
for app in "${apps[@]}"
do
# 核对应用是否运行状态(active)
sudo systemctl is-active $app 2>&1 >/dev/null
if [ $? -eq 0 ];then
echo "$app is running..."
else
# 重启异常的应用
sudo systemctl restart $app
# 统计重启的应用数量
let restartCount++
# 用变量记录重启的应用名,将另一个字符串连接到变量的末尾
#restartApp="${restartApp} \n$app"
restartApp="${restartApp} $app"
# 检查重启后应用是否正常
systemctl is-active $app 2>&1 >/dev/null
if [ $? -ne 0 ];then
# 统计重启仍然失败的应用数量
let errorCount++
fi
fi
done
# 计算正常运行的应用数量
let successCount=$count-$errorCount
# 使用变量存储最后结果
messages=$(cat << EOF
标题: 应用异常通知
监控的应用总数量:$count
重启后运行应用数量:$successCount
发生重启的应用数量: $restartCount
重启后仍异常的应用数量: $errorCount
发生重启的应用有: $restartApp
提示:请检查异常的原因
系统当前时间:$(date)
EOF
)
}
# 执行脚本函数
AppAction
SendMessages