背景
使用一个简单的脚本监控线上环境的几个进程,如果进程挂了就及时发送通知,属于风险预警提醒小工具。
具体实现如下(1个文本文件, 1个脚本):
/root/.notice/services.txt
1 2 3
| PROD admin https://admin.xxx.com/admin/health PROD pc https://www.xxx.com/pc/health PROD h5 https://h5.xxx.com/h5/health
|
脚本
/root/.notice/health.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #!/bin/bash
CURL_URL='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx'
push_webhook_msg() { currentDate=`date +%Y-%m-%d`
if [ $1 = 'PROD' ]; then CURL_DATA="{\"msgtype\": \"text\", \"text\": {\"content\": \"$1 环境 $2 服务 $3,请留意!\", \"mentioned_list\":[\"@all\"]}}" else CURL_DATA="{\"msgtype\": \"text\", \"text\": {\"content\": \"$1 环境 $2 服务 $3,请留意!\"}}" fi echo "$CURL_DATA"
CURL_CMD="curl \"$CURL_URL\" -H \"Content-Type: application/json\" -d '$CURL_DATA'"
CURL_RES=$(eval $CURL_CMD) echo $CURL_RES }
file="servers.txt"
watch_server() { while true; do response=$(curl -s $3) echo response=$response code=$(echo $response | jq -r '.code' 2>/dev/null) echo code=$code flag_file="/tmp/$(echo $3 | sha256sum | awk '{print $1}').flag" if [ -n "$code" ] && [ "$code" -eq 200 ]; then if [ ! -f "$flag_file" ]; then echo "$1 $2 已首次恢复,当前只发送一次通知。" touch "$flag_file" push_webhook_msg $1 $2 "【已恢复】" else echo "$1 $2 健康运行中..." fi sleep 60 else if [ -f "$flag_file" ]; then echo "$1 $2 服务不存在,删除flag,并每隔10s发送通知!" rm "$flag_file" fi push_webhook_msg $1 $2 "不存在" sleep 60 fi done }
while read -r line; do parts=($line) env=${parts[0]} ter=${parts[1]} url=${parts[2]} echo env=$env, ter=$ter, url=$url (watch_server $env $ter $url &) done < "$file"
|
/root/.notice/health_shutdown.sh
1 2 3 4 5 6 7 8 9
| #!/bin/bash
pids=`ps -ef |grep health.sh | grep -v grep | cut -d ' ' -f 6` echo pids=$pids
kill -9 $pids if [ $? = 0 ]; then echo "Shutdown Success!" fi
|
启动health.sh后,会根据servers.txt的行数(也就是监控的服务数)启动对应的健康监控进程 health.sh
每隔60s会检测心跳一次,如果检测不到则一直会每隔60s就发送通知。
如果已经进程恢复时,则只会通知一次【已恢复】(应对服务发布时的场景)。