本文目录导读:

我来介绍几种 Shell 脚本监控网站 HTTP 状态码的方法:
基础监控脚本
使用 curl 监控
#!/bin/bash
# 监控单个网站
URL="https://example.com"
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" $URL)
if [ $HTTP_CODE -eq 200 ]; then
echo "$(date) - $URL - 状态正常: $HTTP_CODE"
else
echo "$(date) - $URL - 状态异常: $HTTP_CODE"
fi
多网站批量监控
#!/bin/bash
# 定义要监控的网站列表
WEBSITES=(
"https://example1.com"
"https://example2.com"
"https://example3.com"
)
# 监控函数
check_website() {
local url=$1
local timeout=10
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" \
--connect-timeout $timeout \
--max-time $timeout \
$url)
echo "$(date '+%Y-%m-%d %H:%M:%S') - $url - HTTP状态码: $HTTP_CODE"
# 判断状态码
case $HTTP_CODE in
200|301|302)
return 0
;;
403|404|500|502|503)
return 1
;;
*)
return 2
;;
esac
}
# 主循环
for website in "${WEBSITES[@]}"; do
check_website $website
done
带有告警功能的监控脚本
#!/bin/bash
# 配置
URL="https://example.com"
THRESHOLD_CODE=400 # 告警阈值
ALERT_EMAIL="admin@example.com"
LOG_FILE="/var/log/website_monitor.log"
# 日志函数
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 发送告警
send_alert() {
local subject="网站监控告警 - $URL"
local message="时间: $(date '+%Y-%m-%d %H:%M:%S')
URL: $URL
状态码: $1
错误信息: $2"
echo "$message" | mail -s "$subject" $ALERT_EMAIL
log_message "告警已发送至 $ALERT_EMAIL"
}
# 监控主函数
monitor_website() {
local response_time
local http_code
# 获取HTTP状态码和响应时间
http_code=$(curl -o /dev/null -s -w "%{http_code}" \
--connect-timeout 10 \
--max-time 30 \
$URL 2>&1)
# 检查curl是否成功
if [ $? -ne 0 ]; then
log_message "无法访问 $URL"
send_alert "N/A" "无法连接到服务器"
return 1
fi
# 判断状态码是否异常
if [ $http_code -ge $THRESHOLD_CODE ] || [ $http_code -eq 0 ]; then
log_message "异常状态: $http_code"
send_alert $http_code "HTTP状态码异常"
return 1
else
log_message "正常: HTTP $http_code"
return 0
fi
}
# 执行监控
monitor_website
持续监控并记录日志
#!/bin/bash
# 配置
INTERVAL=60 # 监控间隔(秒)
SITES_FILE="websites.txt" # 网站列表文件
STATUS_LOG="monitor_status.log"
ERROR_LOG="monitor_errors.log"
# 确保日志文件存在
touch $STATUS_LOG $ERROR_LOG
# 监控函数
check_site_status() {
local url=$1
local site_name=$(echo $url | sed 's|https\?://||' | cut -d'/' -f1)
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# 获取HTTP状态码和响应时间
local result=$(curl -o /dev/null -s -w "%{http_code}:%{time_total}" \
--connect-timeout 5 \
--max-time 10 \
$url 2>&1)
local http_code=$(echo $result | cut -d: -f1)
local response_time=$(echo $result | cut -d: -f2)
# 记录状态
echo "$timestamp,$site_name,$http_code,$response_time" >> $STATUS_LOG
# 检查异常
if [ $http_code -ge 400 ] || [ $http_code -eq 0 ]; then
echo "$timestamp,$url,$http_code,$response_time" >> $ERROR_LOG
echo "[ERROR] $url 返回状态码: $http_code"
else
echo "[OK] $url 返回状态码: $http_code (${response_time}s)"
fi
}
# 主循环
while true; do
clear
echo "=== 网站状态监控 ==="
echo "监控时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
# 读取网站列表并检查
while IFS= read -r site || [ -n "$site" ]; do
# 跳过注释和空行
[[ $site =~ ^# ]] && continue
[[ -z $site ]] && continue
check_site_status "$site"
done < "$SITES_FILE"
echo "========================================"
echo "等待 ${INTERVAL} 秒后再次检查..."
echo "按 Ctrl+C 退出"
sleep $INTERVAL
done
增强版监控脚本(带更多功能)
#!/bin/bash
# 配置文件
CONFIG_FILE="monitor_config.conf"
# 默认配置
DEFAULT_INTERVAL=300
DEFAULT_TIMEOUT=10
DEFAULT_RETRY=3
DEFAULT_ALERT_THRESHOLD=400
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 加载配置文件
load_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
echo "使用默认配置"
fi
}
# 高级监控函数
advanced_monitor() {
local url=$1
local max_retry=${2:-$DEFAULT_RETRY}
local retry_count=0
while [ $retry_count -lt $max_retry ]; do
local result=$(curl -o /dev/null -s -w "%{http_code}:%{time_total}:%{size_download}:%{content_type}" \
--connect-timeout $DEFAULT_TIMEOUT \
--max-time $((DEFAULT_TIMEOUT * 2)) \
--location \
$url 2>&1)
local curl_exit_code=$?
local http_code=$(echo $result | cut -d: -f1)
local response_time=$(echo $result | cut -d: -f2)
local size=$(echo $result | cut -d: -f3)
local content_type=$(echo $result | cut -d: -f4)
if [ $curl_exit_code -eq 0 ] && [ $http_code -lt $DEFAULT_ALERT_THRESHOLD ]; then
echo -e "${GREEN}[OK]${NC} $url - HTTP:$http_code - Time:${response_time}s - Size:${size}bytes"
return 0
fi
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retry ]; then
echo -e "${YELLOW}[RETRY]${NC} $url - 尝试 $retry_count/$max_retry"
sleep 2
fi
done
echo -e "${RED}[FAIL]${NC} $url - 所有重试都失败"
return 1
}
# 生成报告
generate_report() {
local report_file="monitor_report_$(date '+%Y%m%d_%H%M%S').txt"
{
echo "网站监控报告"
echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
# 从日志中分析
if [ -f "$STATUS_LOG" ]; then
echo "最近10条状态记录:"
tail -10 $STATUS_LOG
echo ""
echo "异常统计:"
awk -F',' '$3>=400 || $3==0 {count[$2]++} END {for (site in count) print site, count[site] "次异常"}' $STATUS_LOG
fi
} > "$report_file"
echo "报告已生成: $report_file"
}
# 主函数
main() {
load_config
case "${1:-check}" in
check)
# 单次检查
if [ -z "$2" ]; then
echo "请指定要检查的URL"
exit 1
fi
advanced_monitor "$2"
;;
monitor)
# 持续监控
while true; do
clear
echo "=== 持续监控模式 ==="
echo "$(date '+%Y-%m-%d %H:%M:%S')"
echo "----------------------------------------"
while IFS= read -r site; do
[[ $site =~ ^# ]] && continue
[[ -z $site ]] && continue
advanced_monitor "$site"
done < "${2:-websites.txt}"
echo "----------------------------------------"
echo "等待 ${INTERVAL:-$DEFAULT_INTERVAL} 秒..."
sleep ${INTERVAL:-$DEFAULT_INTERVAL}
done
;;
report)
# 生成报告
generate_report
;;
help|*)
echo "使用方法:"
echo " $0 check <URL> - 单次检查指定URL"
echo " $0 monitor [file] - 持续监控,默认读取websites.txt"
echo " $0 report - 生成监控报告"
echo " $0 help - 显示帮助信息"
;;
esac
}
# 执行
main "$@"
使用示例
网站列表文件 (websites.txt)
# 要监控的网站列表
https://www.google.com
https://www.github.com
https://example.com
配置文件 (monitor_config.conf)
# 监控配置 INTERVAL=60 TIMEOUT=10 RETRY=3 ALERT_THRESHOLD=400 ALERT_EMAIL="admin@example.com"
使用建议
-
定时执行:使用 crontab 设置定时任务
# 每5分钟执行一次 */5 * * * * /path/to/monitor.sh check https://example.com
-
日志管理:定期清理和轮转日志文件
-
告警机制:可以集成邮件、短信或钉钉通知
-
性能考虑:设置合理的超时和重试次数
这些脚本可以根据实际需求进行调整和扩展。