本文目录导读:

是的,实用脚本完全可以批量监控。脚本化是实现批量监控最高效、最灵活的方式之一。
“批量监控”通常指对多个目标(如服务器、网站、端口、进程、API 接口)同时进行状态检查,脚本几乎是为这个场景量身定做的。
脚本实现批量监控的常见思路
脚本的核心优势在于循环(Loop)和条件判断,你可以定义一个监控目标列表(如 IP 地址、URL、端口号),然后让脚本逐一检查。
以下是几个不同场景下的典型脚本示例:
批量 Ping(网站/服务器连通性监控)
这是最基础的批量监控,用于检查多台机器是否在线。
Bash 脚本示例 (Linux/macOS):
#!/bin/bash
# 文件名: ping_monitor.sh
# 要监控的目标列表(可以是IP或域名)
HOSTS=("192.168.1.1" "google.com" "example.com" "10.0.0.5")
LOG_FILE="ping_monitor.log"
# 循环检查每个主机
for host in "${HOSTS[@]}"; do
# 发送一个ping包,超时2秒,静默模式
ping -c 1 -W 2 "$host" &> /dev/null
if [ $? -eq 0 ]; then
echo "$(date) - $host - OK" >> "$LOG_FILE"
else
echo "$(date) - $host - FAIL (UNREACHABLE)" >> "$LOG_FILE"
# 可选:发送告警(例如发送邮件或钉钉消息)
# echo "Alert: $host is down" | mail -s "Monitoring Alert" admin@example.com
fi
done
批量 HTTP API / 网页状态监控
检查一批网站的 HTTP 状态码是否正常(如 200 OK),或者检查 API 返回的 JSON 数据。
Python 脚本示例 (更强大、更灵活):
#!/usr/bin/env python3
# 文件名: http_monitor.py
import requests
import logging
from datetime import datetime
# 配置日志
logging.basicConfig(filename='http_monitor.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
# 监控目标列表(URL 和期望的状态码/关键字)
TARGETS = [
{"url": "https://www.baidu.com", "expected_status": 200, "name": "Baidu"},
{"url": "https://github.com/status", "expected_status": 200, "name": "GitHub Status"},
{"url": "https://httpbin.org/status/500", "expected_status": 200, "name": "Expected Fail Test"} # 这个会失败
]
def check_target(target):
try:
# 超时设置,防止卡死
response = requests.get(target['url'], timeout=5)
status_ok = response.status_code == target['expected_status']
if status_ok:
logging.info(f"{target['name']} ({target['url']}) - OK - Status: {response.status_code}")
else:
logging.error(f"{target['name']} ({target['url']}) - FAIL - Expected: {target['expected_status']}, Got: {response.status_code}")
# 触发告警逻辑
except requests.exceptions.RequestException as e:
logging.error(f"{target['name']} ({target['url']}) - FAIL - Exception: {str(e)}")
if __name__ == "__main__":
print(f"Starting batch HTTP monitor at {datetime.now()}")
for target in TARGETS:
check_target(target)
print("Monitor check complete.")
批量端口监控 (使用 nc 或 /dev/tcp)
检查远程服务器上的特定端口(如 80, 443, 22, 3306)是否开放。
Bash 脚本示例 (利用 Bash 内置能力):
#!/bin/bash
# 文件名: port_monitor.sh
# 定义监控目标: "IP 端口"
MONITOR_LIST=(
"192.168.1.10 80"
"192.168.1.10 443"
"google.com 22"
)
check_port() {
local host=$1
local port=$2
# 使用 /dev/tcp (Bash 内置) 或 nc
timeout 2 bash -c "echo >/dev/tcp/$host/$port" &> /dev/null
if [ $? -eq 0 ]; then
echo "$(date) - $host:$port - OPEN"
return 0
else
echo "$(date) - $host:$port - CLOSED/FILTERED"
return 1
fi
}
# 主循环
while read -r line; do
# 跳过空行和注释
[[ -z "$line" || "$line" == \#* ]] && continue
host=$(echo $line | awk '{print $1}')
port=$(echo $line | awk '{print $2}')
check_port $host $port
done <<< "$(printf '%s\n' "${MONITOR_LIST[@]}")"
如何实现自动化与告警?
脚本只是第一步,要形成真正的批量监控系统,通常需要结合以下工具:
-
定时执行(Cron Job / Task Scheduler):
- Linux:使用
crontab -e设置脚本每 5 分钟运行一次。- 示例:
*/5 * * * * /home/user/ping_monitor.sh
- 示例:
- Windows:使用“任务计划程序”定时运行
.bat或.ps1脚本。
- Linux:使用
-
告警通知:
- 脚本内集成:检查到故障后,自动调用 API 发送通知。
- 邮件:
mail命令或 Python 的smtplib。 - 即时通讯:发送消息到钉钉/企业微信/飞书机器人(通过 Webhook)。
- 短信/电话:集成 Twilio、阿里云短信等 API。
-
数据记录与展示(进阶):
- 将监控结果写入数据库(如 InfluxDB、MySQL)。
- 配合可视化工具(如 Grafana、Prometheus + Grafana)生成监控仪表盘。
- 可以批量监控:是的,脚本是实现批量监控的基础方法。
- 优点:高度定制、轻量级、无额外依赖、学习成本低。
- 缺点:对于大规模、分布式、高可用的复杂监控需求,原生脚本可能不够健壮(缺乏分布式协调、数据持久化、自愈功能),此时应考虑专业的解决方案:
- Prometheus + Grafana:云原生监控的事实标准。
- Zabbix:企业级传统监控平台。
- Nagios / Icinga:老牌开源监控系统。
- 商业 SaaS:Datadog, New Relic, Better Uptime。
建议:
- 小规模(<50个目标):用脚本 + Cron + 简单告警(邮件/短信)完全足够。
- 中规模(50-500个目标):脚本 + 数据库(如 InfluxDB)+ 可视化(Grafana)。
- 大规模(>500个目标):建议直接采用 Prometheus 或 Zabbix 等专业监控系统。