当前位置: 首页 > article >正文

Shell脚本自动化监控:用curl的-w参数批量检查网站健康状态(附完整脚本)

Shell脚本自动化监控用curl的-w参数批量检查网站健康状态最近在维护公司十几个微服务时我发现手动检查每个接口状态简直是一场噩梦。直到重新审视了curl的-w参数才意识到这个被低估的功能能带来怎样的效率革命。本文将分享如何用Shell脚本打造一个轻量级但功能完备的网站监控系统。1. 监控需求分析与设计思路当服务规模超过5个时传统的人工检查就变得不可持续。我们需要的监控系统应该具备批量处理能力支持同时检查数十个URL关键指标采集包括但不限于HTTP状态码、响应时间、DNS解析时间异常识别机制对非200状态码、超长响应时间等情况进行标记通知功能发现异常时能及时告警日志记录保留历史数据供后续分析curl的-w参数配合格式化输出可以完美满足这些需求。下面是一个基础监控指标的采集模板curl -o /dev/null -s -w \ HTTP状态码: %{http_code}\n\ DNS解析时间: %{time_namelookup}秒\n\ TCP连接时间: %{time_connect}秒\n\ SSL握手时间: %{time_appconnect}秒\n\ 首字节时间: %{time_starttransfer}秒\n\ 总响应时间: %{time_total}秒\n\ https://example.com2. 核心监控脚本开发2.1 基础脚本框架我们先构建一个可扩展的脚本框架#!/bin/bash # 配置部分 URL_LIST(https://api.service1.com https://app.service2.com/health) TIMEOUT5 # 超时时间(秒) ALERT_THRESHOLD2 # 响应时间告警阈值(秒) # 结果存储 declare -A STATUS_CODES declare -A RESPONSE_TIMES declare -A ALERTS # 监控函数 monitor_url() { local url$1 local result$(curl -o /dev/null -s -L -w \ %{http_code}\ %{time_total}\ --connect-timeout $TIMEOUT $url) local status_code${result:0:3} local response_time${result:3} STATUS_CODES[$url]$status_code RESPONSE_TIMES[$url]$response_time # 异常检测逻辑 if [[ $status_code -ne 200 ]] || (( $(echo $response_time $ALERT_THRESHOLD | bc -l) )); then ALERTS[$url]Status: $status_code, Time: ${response_time}s fi }2.2 高级功能实现批量处理与并发控制# 并发监控控制 MAX_CONCURRENT5 current_jobs0 for url in ${URL_LIST[]}; do monitor_url $url ((current_jobs)) if [[ $current_jobs -ge $MAX_CONCURRENT ]]; then wait -n ((current_jobs--)) fi done wait结果可视化输出# 结果展示函数 display_results() { echo ┌──────────────────────────────────────┬────────────┬──────────────┐ echo │ URL │ 状态码 │ 响应时间(s) │ echo ├──────────────────────────────────────┼────────────┼──────────────┤ for url in ${!STATUS_CODES[]}; do printf │ %-36s │ %-10s │ %-12s │\n \ ${url:0:36} \ ${STATUS_CODES[$url]} \ ${RESPONSE_TIMES[$url]} done echo └──────────────────────────────────────┴────────────┴──────────────┘ # 告警信息 if [[ ${#ALERTS[]} -gt 0 ]]; then echo -e \n\033[31m⚠️ 发现异常:\033[0m for alert in ${!ALERTS[]}; do echo - ${alert}: ${ALERTS[$alert]} done fi }3. 生产环境增强功能3.1 告警通知集成邮件通知示例send_alert() { local subject[监控告警] 服务异常检测 local body检测时间: $(date)\n\n异常列表:\n for alert in ${!ALERTS[]}; do body - $alert: ${ALERTS[$alert]}\n done echo -e $body | mail -s $subject ops-teamcompany.com }飞书机器人集成notify_via_feishu() { local webhookhttps://open.feishu.cn/open-apis/bot/v2/hook/xxx local content{\msg_type\:\text\,\content\:{\text\:\[监控告警]检测到异常:\\n for alert in ${!ALERTS[]}; do content - $alert: ${ALERTS[$alert]}\\n done content\}} curl -X POST -H Content-Type: application/json -d $content $webhook }3.2 历史日志记录log_results() { local log_file/var/log/url_monitor/$(date %Y-%m-%d).log local timestamp$(date %Y-%m-%d %H:%M:%S) { echo [$timestamp] 监控结果: for url in ${!STATUS_CODES[]}; do echo - $url: ${STATUS_CODES[$url]}, ${RESPONSE_TIMES[$url]}s done if [[ ${#ALERTS[]} -gt 0 ]]; then echo [$timestamp] 告警信息: for alert in ${!ALERTS[]}; do echo - $alert: ${ALERTS[$alert]} done fi } $log_file }4. 高级监控策略4.1 响应时间趋势分析analyze_response_trend() { local url$1 local current_time${RESPONSE_TIMES[$url]} local avg_time$(calculate_average $url) # 如果当前响应时间超过平均值的150%触发告警 if (( $(echo $current_time $avg_time * 1.5 | bc -l) )); then ALERTS[$url]响应时间突增: ${current_time}s (平均: ${avg_time}s) fi } calculate_average() { local url$1 local log_file/var/log/url_monitor/response_times.log # 从日志中提取最近10次响应时间计算平均值 grep $url $log_file | tail -n 10 | awk {sum$NF} END {print sum/NR} }4.2 可用性统计报表generate_availability_report() { local report_file/var/log/url_monitor/weekly_report_$(date %Y-%m-%d).txt echo 服务可用性周报 ($(date %Y-%m-%d)) $report_file echo $report_file for url in ${URL_LIST[]}; do local total_checks$(grep -c $url /var/log/url_monitor/*.log) local success_checks$(grep $url /var/log/url_monitor/*.log | grep -c 200,) local availability$(echo scale2; $success_checks * 100 / $total_checks | bc) echo -e \n服务: $url $report_file echo 检查次数: $total_checks $report_file echo 成功次数: $success_checks $report_file echo 可用性: ${availability}% $report_file done # 发送报表 mail -s 服务可用性周报 ops-teamcompany.com $report_file }5. 实际部署建议定时任务配置# 每5分钟执行一次监控 */5 * * * * /opt/scripts/url_monitor.sh /var/log/url_monitor/cron.log 21日志轮转配置/etc/logrotate.d/url_monitor/var/log/url_monitor/*.log { daily rotate 30 compress missingok notifempty create 640 root adm }性能优化技巧使用curl --parallel进行并行请求需要curl 7.66.0对内部服务使用--resolve跳过DNS查询设置合理的--connect-timeout和--max-time安全注意事项将敏感URL存储在配置文件中而非脚本内使用chmod 600保护包含认证信息的脚本对告警通知内容进行脱敏处理

相关文章:

Shell脚本自动化监控:用curl的-w参数批量检查网站健康状态(附完整脚本)

Shell脚本自动化监控:用curl的-w参数批量检查网站健康状态 最近在维护公司十几个微服务时,我发现手动检查每个接口状态简直是一场噩梦。直到重新审视了curl的-w参数,才意识到这个被低估的功能能带来怎样的效率革命。本文将分享如何用Shell脚本…...

[具身智能-291]:计算机音频主要的功能、常见的库和工具

计算机音频领域涉及从底层的信号处理到上层的应用开发,其功能、库和工具种类繁多。以下为你梳理了计算机音频的主要功能以及在不同编程语言和场景下常见的库与工具。🎵 计算机音频的主要功能计算机音频处理的核心是围绕数字信号展开的,主要功…...

DeepSeek-R1-Distill-Llama-8B在YOLOv8目标检测中的应用实践

DeepSeek-R1-Distill-Llama-8B在YOLOv8目标检测中的应用实践 1. 当目标检测遇上大模型:为什么需要LLM的智能加持 在安防监控系统里,我们经常遇到这样的场景:摄像头拍到画面中有人拿着工具靠近配电箱,系统却只标注出"人&quo…...

AI入门必看|一文搞懂人工智能是什么,小白也能秒懂

前言:随着ChatGPT、自动驾驶、AI绘画的普及,人工智能已经从“高大上的科技概念”走进了我们的日常生活,但很多小白面对“人工智能”四个字,还是会感到迷茫——它到底是什么?能做什么?和我们普通人有什么关系…...

无线安全入门:如何像Willie一样用能量检测发现隐蔽信号?一个MATLAB仿真指南

无线安全实战:用MATLAB仿真攻击者Willie的能量检测策略 想象一下,你正坐在一个嘈杂的咖啡厅里,周围充斥着各种无线信号——Wi-Fi、蓝牙、蜂窝网络。如果有人想在这些背景噪音中偷偷传输数据,该如何确保不被发现?这就是…...

Java JDK1.9快速下载与安装指南

1. Java JDK1.9简介与下载准备 Java Development Kit(JDK)是Java开发的核心工具包,而JDK1.9作为早期版本,虽然现在已经不是主流选择,但在某些特定场景下仍然有开发者需要使用。如果你正在寻找JDK1.9的下载和安装方法&a…...

Qwen3-TTS-Tokenizer-12Hz生产环境应用:高并发音频编解码服务架构

Qwen3-TTS-Tokenizer-12Hz生产环境应用:高并发音频编解码服务架构 1. 引言:音频编解码的技术挑战与解决方案 在现代语音应用中,音频数据的处理和传输一直是个头疼的问题。你想啊,一段普通的语音文件,动辄就是几MB甚至…...

Pixel Epic · Wisdom Terminal 辅助MATLAB算法仿真与数据分析

Pixel Epic Wisdom Terminal 辅助MATLAB算法仿真与数据分析 1. 科研算法开发的效率痛点 科研人员和算法工程师经常面临这样的困境:脑子里有清晰的算法思路,却要花费大量时间在MATLAB代码实现上。从算法构思到可运行的仿真模型,中间隔着繁琐…...

【Python 入门到精通】第 5 章:字典与结构化数据,从基础到实战全解析

前言在 Python 中,列表是我们最常用的线性数据结构,但它只能按顺序存储数据,无法快速通过 “名称” 查找对应的值。而字典(dict) 作为 Python 中最核心的 “键 - 值对” 数据结构,完美解决了这个问题 —— …...

从FP32到INT8:在RK3588开发板上实测RKNN量化对YOLOv5推理速度与精度的真实影响

从FP32到INT8:在RK3588开发板上实测RKNN量化对YOLOv5推理速度与精度的真实影响 当你在RK3588开发板上部署YOLOv5模型时,是否遇到过这样的困境:模型精度令人满意,但推理速度却无法满足实时性要求?这就是我们今天要探讨的…...

基于RexUniNLU的Java企业级文本分析系统构建指南

基于RexUniNLU的Java企业级文本分析系统构建指南 1. 引言 想象一下这样的场景:你的电商平台每天收到数万条客户反馈,客服团队需要手动分类处理;法务部门每天要审核大量合同,寻找关键条款;市场团队需要从海量评论中提…...

OpenClaw云端体验版:Phi-3-vision-128k-instruct沙盒环境快速验证

OpenClaw云端体验版:Phi-3-vision-128k-instruct沙盒环境快速验证 1. 为什么选择云端沙盒体验 当我第一次听说OpenClaw时,就被它"让AI像人类一样操作电脑"的理念吸引了。但作为一个谨慎的技术人,我习惯在正式投入时间前先做可行性…...

WPF Chart控件从入门到精通:手把手教你打造动态数据看板

WPF Chart控件从入门到精通:手把手教你打造动态数据看板 在数据驱动的时代,能够直观呈现业务指标的动态数据看板已成为企业决策的标配工具。作为.NET开发者,掌握WPF Chart控件的深度应用,意味着你能够快速构建专业级的数据可视化解…...

LiuJuan Z-Image Generator在内容创作中的落地:自媒体头像/封面图定制化生产方案

LiuJuan Z-Image Generator在内容创作中的落地:自媒体头像/封面图定制化生产方案 你是不是也遇到过这样的烦恼?想给自己的自媒体账号换个有辨识度的头像,或者为下一期视频设计一个吸引眼球的封面图,结果要么是找不到合适的素材&a…...

从URDF到MoveIt!手把手教你为六轴机械臂配置运动规划(避坑指南)

从URDF到MoveIt!六轴机械臂运动规划实战全解析 当你第一次在RViz中看到自己设计的六轴机械臂模型时,那种成就感难以言表。但很快你会发现,静态展示只是万里长征的第一步——如何让这个钢铁手臂真正"活"起来?这就是MoveI…...

手把手教你用FPGA(EP4CE6)驱动M25P16 Flash:从SPI时序图到Verilog状态机的保姆级实战

FPGA实战:EP4CE6驱动M25P16 Flash的SPI状态机设计全解析 当我在实验室第一次成功通过FPGA读取到Flash芯片中的数据时,那种成就感至今难忘。对于初学者来说,理解如何将芯片手册中的时序图转化为可运行的Verilog代码,就像学习一门新…...

避坑指南:ROS2与NVIDIA Isaac Sim联调机械臂,我踩过的那些“坑”

ROS2与NVIDIA Isaac Sim联调机械臂:开发者避坑实战手册 当机械臂在虚拟环境中突然抽搐起舞,当关节角度指令像被黑洞吞噬般消失无踪——这些场景对尝试将ROS2与NVIDIA Isaac Sim联调的开发者来说并不陌生。作为经历过数十次配置崩溃的老兵,我将…...

新手友好:黑丝空姐-造相Z-Turbo镜像的详细操作步骤

新手友好:黑丝空姐-造相Z-Turbo镜像的详细操作步骤 你是不是对AI生成图片很感兴趣,特别是想试试那些能生成特定风格图片的模型?今天要介绍的这个“黑丝空姐-造相Z-Turbo”镜像,就是一个专门用于生成黑丝空姐风格图片的AI模型服务…...

MicroBlaze 大程序 Flash 固化与自启

MicroBlaze 大程序 Flash 固化与自启1. 核心原因分析:为什么大程序不能直接固化?在带 ARM 核的 FPGA(如 Zynq 系列)中,硬件内置了 BootROM 和 FSBL 机制,可以自动处理镜像打包和 DDR 初始化。但在 纯 FPGA&…...

GLM-4-9B-Chat-1M效果惊艳:长篇小说逻辑梳理+代码库跨文件调试实录

GLM-4-9B-Chat-1M效果惊艳:长篇小说逻辑梳理代码库跨文件调试实录 1. 开篇:本地大模型的突破性体验 当我第一次用GLM-4-9B-Chat-1M处理完一整部长篇小说后,真的被震撼到了。这不是那种需要联网等待的云端服务,而是在我自己电脑上…...

Qwen3-VL-8B优化指南:如何选择量化模型,提升Mac运行速度

Qwen3-VL-8B优化指南:如何选择量化模型,提升Mac运行速度 1. 引言:Mac上的多模态AI挑战 在Mac设备上运行大型视觉-语言模型一直是个技术难题。传统多模态模型通常需要高端GPU和大量显存,而MacBook的硬件配置往往难以满足这些要求…...

Qwen3-ASR-1.7B开发入门:MySQL数据库集成教程

Qwen3-ASR-1.7B开发入门:MySQL数据库集成教程 1. 引言 语音识别技术正在改变我们与设备交互的方式,而将识别结果持久化存储是许多实际应用的关键需求。今天我们来聊聊如何将Qwen3-ASR-1.7B这个强大的语音识别模型与MySQL数据库结合起来,让你…...

告别预编译库:手把手教你从源码构建OpenCL开发环境(ARM64平台专属指南)

告别预编译库:手把手教你从源码构建OpenCL开发环境(ARM64平台专属指南) 在ARM64架构的嵌入式开发领域,预编译的OpenCL库往往成为性能调优的瓶颈。当你在RK3588这样的高性能平台上开发时,是否遇到过驱动版本不匹配、API…...

阿里通义Z-Image-GGUF使用心得:小白也能玩转的高质量文生图

阿里通义Z-Image-GGUF使用心得:小白也能玩转的高质量文生图 1. 30秒快速上手:从零到第一张AI画作 你是不是也曾在社交媒体上看到那些惊艳的AI生成图片,心里想着"这一定很难操作"?今天我要告诉你一个好消息&#xff1a…...

OpenClaw故障自愈:Qwen3.5-9B诊断脚本错误与自动重试机制

OpenClaw故障自愈:Qwen3.5-9B诊断脚本错误与自动重试机制 1. 为什么需要故障自愈能力 上周我在用OpenClaw自动化处理一批Python数据分析脚本时,遇到了一个典型问题:凌晨3点脚本运行失败,直到早上8点查看日志才发现问题。这种&qu…...

从“手扫感应灯”拆解开始:聊聊三极管放大电路在生活中的那些实用设计

从“手扫感应灯”拆解开始:聊聊三极管放大电路在生活中的那些实用设计 每次深夜回家,摸黑找开关的体验总让人抓狂。直到我在玄关装了一盏挥手即亮的感应灯,这个不到50元的小玩意儿彻底改变了我的生活习惯——无需触碰,手在灯前轻轻…...

Dify平台低代码集成:可视化工作流编排Pixel Couplet Gen创作过程

Dify平台低代码集成:可视化工作流编排Pixel Couplet Gen创作过程 1. 春联创作的传统痛点与AI解决方案 每到春节前夕,无论是企业还是个人,都会面临一个共同的需求:创作富有节日氛围的春联。传统方式下,这个过程往往需…...

OLLAMA部署本地大模型新选择:LFM2.5-1.2B-Thinking支持思维链可视化输出

OLLAMA部署本地大模型新选择:LFM2.5-1.2B-Thinking支持思维链可视化输出 1. 模型简介:口袋里的AI大脑 LFM2.5-1.2B-Thinking是一个专门为设备端部署设计的智能文本生成模型,它在保持小巧体积的同时,提供了令人惊喜的智能水平。这…...

OpenClaw日程管理:千问3.5-9B解析邮件创建待办

OpenClaw日程管理:千问3.5-9B解析邮件创建待办 1. 为什么需要AI助手管理日程? 每天早上打开邮箱,总能看到十几封未读邮件——会议邀请、项目更新、待办提醒混杂在一起。上周我就因为漏看了一封包含截止日期变更的邮件,差点耽误了…...

深入解析航顺HK32F030C8T6与STM32F030的兼容性差异及实战调优

1. 航顺HK32F030C8T6与STM32F030的硬件差异解析 第一次拿到航顺HK32F030C8T6这颗国产MCU时,我下意识以为它和STM32F030可以完全互换。但实际在智能家居项目中踩坑后才发现,两者的硬件差异远比想象中多。最明显的区别就是主频——STM32F030最高只能跑到48…...