在应用系统正式发布并投入运行后,系统可能会因多种潜在问题而遭遇宕机或陷入假死状态。特别是在生产环境中,一旦出现此类故障,若管理员未能迅速察觉并立即组织运维团队进行修复,将可能给客户带来不便,同时给公司造成重大经济损失及声誉损害。传统上,依赖人工实时监控应用系统虽为一种手段,但其高昂的成本及对监控人员专业技能的高要求,使得这一方法并非最优选择。
鉴于此,探索并实施一套能够自动监控应用系统运行状态的系统显得尤为迫切。该系统应具备在检测到异常时,即时通过短信和邮件等方式通知相关人员的能力。此举不仅能显著降低运维成本,还能确保问题被及时发现并迅速解决,从而提升客户满意度与服务质量。
本文旨在分享一套经过实践验证的有效解决方案。该方案的核心思路包含两点:一是通过监控应用系统的端口状态来间接判断其运行情况;二是直接监测应用系统的可访问性,以确认其是否正常运行。在实际应用中,我们的团队已同时采用了这两种策略。然而,值得注意的是,在应用系统出现假死(如内存溢出OOM等情况)时,尽管端口可能仍然处于开启状态,导致第一种监控方法失效,但应用系统实际上已无法正常提供服务。相比之下,第二种方法通过直接检测系统的可访问性,能够更为准确、及时地捕捉到这类问题,实现精准监控与快速响应。
因此,本文将重点介绍第二种方案的设计思路与实现细节。该方案已在多个线上系统中稳定运行多年,其有效性与可靠性得到了充分验证。现将其分享给各位同仁,希望能为大家提供有价值的参考与借鉴。同时,我们也诚恳地欢迎各方提出宝贵意见与建议,共同推动该方案的持续优化与完善。
服务器:Linux/Unix
应用系统可访问的页面或请求:准备一个无需权限可以直接访问的页面,例如:“.jsp”、“.html”、“.php”等,建议用“.html”。当然也可以是后端的请求,只要可以正常的访问即可。
“.html”代码样例参考“Welcome.html”,这个页面的代码越简单越好,代码如下:
<div><a>Welcomea>div>
邮件服务器的SMTP地址和端口 ,如下供参考:
smtp_server=“smtp.exmail.qq.com”
smtp_port=“465”
发件人的邮箱帐号和密码,如下供参考:
sender_email=“[email protected]/xxxx”
sender_password=“simon”
From邮箱帐号,如下供参考:
from_email=“[email protected]”
说明:From邮箱帐号可以理解为用于发送提醒邮箱的别名,无需直接暴露真实的发件邮箱帐号。
收件人的邮箱地址,如下供参考:
recipient_email1=“[email protected]”
recipient_email2=“[email protected]”
抄送人的邮箱,如下供参考:
cc_email_1=“[email protected]”
cc_email_2=“[email protected]”
邮件主题和内容,如下供参考:
subject=“请核查环境运行情况”
body=“Monitoring Server Warn 请核查环境运行情况”
考虑功能的复用,功能建议分发送电邮的bash脚本和超时监听的bash脚本。
下面附上发送电邮的bash的脚本,提供一段服务器有密码方案,一段服务器无密码方案,变量部分还请依据实际情况修改。
#!/bin/bash
tomcatServerName=$1
# 邮件服务器的SMTP地址和端口
smtp_server="smtp.exmail.qq.com"
smtp_port="465"
# 发件人的邮箱帐号和密码
sender_email="[email protected]"
sender_password="simon"
# From邮箱帐号
from_email="[email protected]"
# 收件人的邮箱地址
recipient_email="[email protected]"
# 抄送人的邮箱地址
cc_email_1="[email protected]"
# 邮件主题和内容
subject="请核查环境运行情况"
body="请核查环境运行情况。"
# 获取当前时间戳
current_time=$(date -d today +"%Y-%m-%d %H:%M:%S")
# 邮件主题和内容
subject="请核查环境运行情况"
body="Monitoring Server Warn 请核查环境运行情况"
# 构建邮件内容
mailcontent="From: $from_email \r\n"
mailcontent+="To: $recipient_email \r\n"
mailcontent+="Cc: $cc_email_1 \r\n"
mailcontent+="Subject: 【${ServerName}-Monitoring】$tomcatServerName:$subject \r\n"
mailcontent+="Content-Type: text/plain; charset=UTF-8 \r\n"
mailcontent+="\r\n"
mailcontent+="Time:$current_time \r\n System:$tomcatServerName \r\n Content:$body"
# 使用curl命令发送邮件
curl --silent --mail-from "$sender_email" \
--mail-rcpt "$recipient_email" \
--mail-rcpt "$cc_email_1" \
--url "smtps://$smtp_server:$smtp_port" \
--user "$sender_email:$sender_password" \
--upload-file <(echo -e "$mailcontent")
#!/bin/bash
tomcatServerName=$1
ServerName=$2
# 发件人的邮箱帐号和密码
sender_email="[email protected]"
# From邮箱帐号
from_email="[email protected]"
# 收件人的邮箱地址
recipient_email="[email protected]"
# 抄送人的邮箱地址
cc_email_1="[email protected]"
cc_email_2="[email protected]"
cc_email_3="[email protected]"
cc_email_4="[email protected]"
cc_email_5="[email protected]"
# 邮件服务器的SMTP地址和端口
smtp_server="xx.xx.xx.xx"
smtp_port="25"
# 邮件主题和内容
subject="请核查环境运行情况"
body="Monitoring Server Warn 请核查环境运行情况"
# 获取当前时间戳
current_time=$(date -d today +"%Y-%m-%d %H:%M:%S")
# 构建邮件内容
mailcontent="From: $from_email \r\n"
mailcontent+="To: $recipient_email \r\n"
mailcontent+="Cc: $cc_email_1, $cc_email_2, $cc_email_3, $cc_email_4, $cc_email_5 \r\n"
mailcontent+="Subject: 【${ServerName}-Monitoring】$tomcatServerName:$subject \r\n"
mailcontent+="Content-Type: text/plain; charset=UTF-8 \r\n"
mailcontent+="\r\n"
mailcontent+="Time:$current_time \r\n System:$tomcatServerName \r\n Content:$body"
# 使用curl命令发送邮件
curl --url "smtp://$smtp_server:$smtp_port" \
--mail-from "$sender_email" \
--mail-rcpt "$recipient_email" \
--mail-rcpt "$cc_email_1" \
--mail-rcpt "$cc_email_2" \
--mail-rcpt "$cc_email_3" \
--mail-rcpt "$cc_email_4" \
--mail-rcpt "$cc_email_5" \
--upload-file <(echo -e "$mailcontent")
下面附上超时监听的bash的脚本,邮箱服务器有密码和无密码方案相同,变量部分还请依据实际情况修改。
#!/bin/bash
ServerName="PRO1"
ServerIP1="xx.xxx.xxx.1"
# 应用服务器地址和端口 [UAT环境]
server_url_c_1="http://$ServerIP1:8080/Welcome.html"
# 连接超时时间(以秒为单位)
con_timeout_time=5
# 请求超时时间(以秒为单位)
max_timeout_time=5
# 循环检查应用服务是否启动完成
while true; do
# 获取当前时间戳
current_time=$(date -d today +"%Y-%m-%d %H:%M:%S")
# 截取年月日部分
current_timeYMD=$(echo "$current_time" | cut -d ' ' -f 1)
# 截取时分部分
current_timeHM=$(echo "$current_time" | cut -d ' ' -f 2 | cut -d ':' -f 1,2)
# 检查应用服务是否可访问
response_c=$(curl -s -o /u01/toMonitoring/log.txt -w "%{http_code}" --connect-timeout $con_timeout_time --max-time $max_timeout_time $server_url_c_1)
# 检查服务器状态
if [ $response_c != 200 ]; then
bash ./sendEMail.sh $(echo "$ServerName"_tomcat_c) $ServerName
printf "$current_time tomcat_c runing exception !!! \n" >> pro1_logfile_$current_timeYMD.txt
sleep 30 # 服务器运行异常,等待30秒后再尝试一次
else
printf "$current_time There no tomcat server, Please Check !!! \n" >> pro1_logfile_$current_timeYMD.txt
fi
if [[ $current_timeHM == *"08:00"* || $current_timeHM == *"12:00"* || $current_timeHM == *"18:00"* ]]; then
bash ./sendEMail.sh $(echo "$ServerName"_SUCCESS) $ServerName
printf "$current_time All tomcat server runing and send Email !!! \n" >> pro1_logfile_$current_timeYMD.txt
sleep 120 # 发电邮提醒所有服务器(系统)运行正常,2分钟继续执行
fi
done
nohup ./timeout_reminder_pro1.sh
ps aux | grep .sh
ps aux | grep timeout_reminder_pro1.sh
kill 1234
~/.bash_profile 环境变量中配置如下内容:
alias toMmenu='/u01/toMonitoring/timeout_reminder_pro1.sh'
1、HTTPS 与 HTTP 的 curl 安全选项
curl -k https://example.com
⚠️ 生产环境慎用:建议配置合法证书或通过 -E/--cert 指定客户端证书。
2、HTTP 请求:
切勿 使用 -k 参数,避免混淆安全上下文:
curl http://example.com # 正确写法
3、超时参数配置(自动化监控关键)
curl --connect-timeout 3 --max-time 8 http://example.com/health
1)先检测连接:3 秒内未完成 TCP 握手则判定为网络层故障。
2)再限制总耗时:8 秒内未完成整个请求(含服务器处理)则终止。
4、邮件发送依赖与版本要求
# Ubuntu/Debian
sudo apt-get install curl # 默认版本通常较新
# CentOS/RHEL
sudo yum install curl # 或通过源码编译升级
具体安装步骤请参考 curl 官方文档。
sed -i 's/\r$//' *.sh;
chmod u+x *..sh;
在实际应用过程中,由于业务文化差异、审计合规要求、应用系统语言特性以及项目环境多样性等因素,可能会对应用系统监听方案提出个性化需求。因此,建议大家根据自身实际情况,灵活调整并使用本方案,切勿生搬硬套。同时,受篇幅与场景限制,方案中可能未涵盖所有细节,请大家结合具体需求进行完善。若在使用过程中有任何疑问或需要进一步交流,欢迎随时沟通,谢谢!