Shell脚本如何监控网站HTTP状态码

wen 实用脚本 1

本文目录导读:

Shell脚本如何监控网站HTTP状态码

  1. 基础监控脚本
  2. 带有告警功能的监控脚本
  3. 持续监控并记录日志
  4. 增强版监控脚本(带更多功能)
  5. 使用示例
  6. 使用建议

我来介绍几种 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"

使用建议

  1. 定时执行:使用 crontab 设置定时任务

    # 每5分钟执行一次
    */5 * * * * /path/to/monitor.sh check https://example.com
  2. 日志管理:定期清理和轮转日志文件

  3. 告警机制:可以集成邮件、短信或钉钉通知

  4. 性能考虑:设置合理的超时和重试次数

这些脚本可以根据实际需求进行调整和扩展。

抱歉,评论功能暂时关闭!