服务健康检查脚本:linux-tutorial中的curl与wget使用
你是否遇到过服务宕机却浑然不觉?线上服务异常5分钟,可能导致数千用户流失。本文将带你用linux-tutorial项目中的curl与wget工具,打造专业级服务健康检查脚本,实现服务状态实时监控、异常自动告警,让你从此告别"后知后觉"的运维困境。
为什么需要健康检查脚本
在Linux服务器运维中,服务中断往往比想象中更频繁:内存溢出导致API无响应、磁盘满了让数据库工作异常、网络波动引发依赖服务超时...手动巡检不仅耗时,更可能错过黄金恢复时间。一个可靠的健康检查脚本能像"电子护士"一样,7×24小时守护你的服务。
项目中已有大量利用curl/wget实现自动化的案例:
- redis-install.sh 使用curl下载安装包
- mysql-install.sh 通过wget获取配置文件
- fastdfs-install.sh 结合两者完成分布式文件系统部署
这些脚本证明curl与wget不仅是下载工具,更是构建服务监控体系的基础组件。
curl与wget核心能力对比
| 功能特性 | curl(客户端URL工具) | wget(网络下载工具) | 健康检查适用性 |
|---|---|---|---|
| 协议支持 | HTTP/HTTPS/FTP/SCP等20+协议 | 主要支持HTTP/HTTPS/FTP | curl更全面 |
| 状态码获取 | -I参数直接返回HTTP头 | --server-response需解析输出 | curl更便捷 |
| 超时控制 | -m <秒数>精确控制 | -T <秒数>仅支持下载超时 | curl更专业 |
| 输出抑制 | -s静默模式不干扰日志 | -q仅减少输出不彻底 | curl更干净 |
| 安装情况 | 主流Linux默认预装 | 部分最小化系统需额外安装 | 打平 |
项目实践:nginx-install.sh同时使用了
curl -o下载源码包和wget -N更新配置文件,展示了两者协同工作的可能性。
基础健康检查脚本实现
1. 简易HTTP状态检查(curl版)
创建文件:codes/shell/系统管理/service-check-curl.sh
#!/bin/bash
# 服务健康检查脚本(curl版)
URL="http://localhost:8080/health"
TIMEOUT=5
LOG_FILE="/var/log/service-health.log"
# 获取状态码(-I只请求头,-s静默模式,-m超时控制)
STATUS=$(curl -I -s -m $TIMEOUT $URL -o /dev/null -w "%{http_code}")
# 记录检查结果
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Service status: $STATUS" >> $LOG_FILE
# 判断状态码(2xx/3xx表示正常)
if [[ $STATUS -ge 200 && $STATUS -lt 400 ]]; then
echo "Service is healthy"
exit 0
else
echo "Service is unhealthy"
exit 1
fi
2. 文件下载验证(wget版)
创建文件:codes/shell/系统管理/service-check-wget.sh
#!/bin/bash
# 服务健康检查脚本(wget版)
URL="http://localhost:8080/favicon.ico"
OUTPUT="/tmp/health-check.tmp"
TIMEOUT=10
# 下载文件(-q安静模式,-T超时设置,-O输出到文件)
wget -q -T $TIMEOUT $URL -O $OUTPUT
# 检查下载结果
if [ $? -eq 0 ] && [ -s $OUTPUT ]; then
echo "Resource available"
rm $OUTPUT
exit 0
else
echo "Resource unavailable"
exit 1
fi
这两个脚本遵循项目中基本脚本的编码规范,使用了统一的变量命名风格和错误处理机制。
进阶监控方案
1. 多节点监控矩阵
#!/bin/bash
# 多节点健康检查脚本
declare -A SERVICES=(
["api-server"]="http://192.168.1.10:8080/health"
["db-proxy"]="http://192.168.1.11:8081/status"
["cache-layer"]="http://192.168.1.12:8082/ping"
)
for NAME in "${!SERVICES[@]}"; do
URL=${SERVICES[$NAME]}
# 使用curl的--connect-timeout参数仅限制连接阶段超时
STATUS=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 3 $URL)
if [[ $STATUS -eq 200 ]]; then
echo "[$(date +'%H:%M')] $NAME is UP"
else
echo "[$(date +'%H:%M')] $NAME is DOWN (status: $STATUS)" | mail -s "服务告警" admin@example.com
fi
done
这个脚本借鉴了systemctl命令的服务管理思想,将多个服务节点组织成键值对,实现批量监控和异常通知。
2. 定时执行与日志轮转
结合crontab定时任务实现周期监控:
# 编辑定时任务
crontab -e
# 添加以下配置(每5分钟执行一次检查)
*/5 * * * * /bin/bash /data/web/disk1/git_repo/GitHub_Trending/lin/linux-tutorial/codes/shell/系统管理/service-check-curl.sh >> /var/log/service-monitor.log 2>&1
# 设置日志轮转(创建/etc/logrotate.d/service-monitor)
cat > /etc/logrotate.d/service-monitor << 'EOF'
/var/log/service-monitor.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
}
EOF
这种配置确保监控日志不会无限增长,符合项目中logrotate最佳实践的设计理念。
企业级监控架构
健康检查脚本只是服务可靠性体系的第一层防护。在linux-tutorial项目中,你可以将这些脚本与以下组件结合,构建完整监控闭环:
相关实现参考:
- 日志收集:elk-install.sh
- 告警配置:logstash.conf
- 可视化方案:install_grafana.sh
实战技巧与避坑指南
-
超时设置黄金法则:
# 生产环境建议设置为服务P99响应时间的3倍 curl -m 10 https://api.example.com/health # 比平均响应多留余量 -
避免"监控风暴": 当服务恢复时,脚本可能短时间内发送大量恢复通知。可通过创建状态缓存文件实现防抖:
if [ "$STATUS" != "$(cat /tmp/last-status)" ]; then send_alert $STATUS # 仅状态变化时发送通知 echo $STATUS > /tmp/last-status fi -
证书问题处理: 对于内部服务可临时跳过SSL验证(不建议生产环境):
curl -k https://internal-service:8443/health # 忽略证书校验 -
代理环境适配: 如服务器位于防火墙后,可通过环境变量配置代理:
export https_proxy=http://proxy-server:3128 wget https://api.example.com/health # 自动使用代理
总结与扩展学习
通过本文你已掌握:
- 使用curl/wget构建基础健康检查脚本
- 多节点监控方案的设计与实现
- 与crontab/logrotate集成的系统配置
- 企业级监控架构的演进路径
下一步建议学习:
记住,最好的监控系统是你实际部署并持续优化的系统。从今天开始,用本文学到的知识为你的核心服务添加健康检查脚本,让linux-tutorial项目中的自动化理念真正保护你的业务连续性。
项目仓库地址:https://gitcode.com/GitHub_Trending/lin/linux-tutorial
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



