跳转到内容

系统监控脚本实战

课程介绍

系统监控是运维工作的重要组成部分,通过监控可以及时发现系统问题。本课程将通过实战案例,带你学习如何编写系统监控脚本,包括CPU监控、内存监控、磁盘监控、网络监控等核心功能。

1. 系统监控概述

1.1 什么是系统监控

系统监控是指对系统的运行状态进行实时监控。

系统监控的目的

目的说明
性能监控监控系统性能
故障预警预警系统故障
资源管理管理系统资源
容量规划规划系统容量

1.2 监控指标

系统监控有多种指标。

监控指标

指标说明
CPUCPU使用率、负载
内存内存使用率、交换空间
磁盘磁盘使用率、IO
网络网络流量、连接数
进程进程数量、状态

2. CPU监控脚本

2.1 CPU使用率监控

监控CPU使用率。

脚本

bash
#!/bin/bash
# CPU使用率监控脚本

# 获取CPU使用率
function get_cpu_usage {
    # 获取CPU使用率
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    
    echo "CPU使用率:$CPU_USAGE%"
}

# 监控CPU使用率
echo "===== CPU使用率监控 ====="
get_cpu_usage

使用方法

bash
# 赋予执行权限
chmod +x cpu_usage_monitor.sh

# 执行脚本
./cpu_usage_monitor.sh

2.2 CPU负载监控

监控CPU负载。

脚本

bash
#!/bin/bash
# CPU负载监控脚本

# 获取CPU负载
function get_cpu_load {
    # 获取CPU负载
    CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}')
    
    echo "CPU负载:$CPU_LOAD"
}

# 监控CPU负载
echo "===== CPU负载监控 ====="
get_cpu_load

使用方法

bash
# 赋予执行权限
chmod +x cpu_load_monitor.sh

# 执行脚本
./cpu_load_monitor.sh

2.3 CPU核心监控

监控CPU核心使用率。

脚本

bash
#!/bin/bash
# CPU核心监控脚本

# 获取CPU核心使用率
function get_cpu_core_usage {
    # 获取CPU核心数量
    CPU_CORES=$(nproc)
    
    echo "===== CPU核心使用率监控 ====="
    echo "CPU核心数:$CPU_CORES"
    
    # 获取每个CPU核心的使用率
    for i in $(seq 0 $((CPU_CORES - 1)))
    do
        # 获取CPU核心使用率
        CPU_CORE_USAGE=$(mpstat -P $i 1 1 | awk '/Average/ {print 100 - $12}')
        
        echo "CPU核心$i使用率$CPU_CORE_USAGE%"
    done
}

# 监控CPU核心使用率
get_cpu_core_usage

使用方法

bash
# 赋予执行权限
chmod +x cpu_core_monitor.sh

# 执行脚本
./cpu_core_monitor.sh

3. 内存监控脚本

3.1 内存使用率监控

监控内存使用率。

脚本

bash
#!/bin/bash
# 内存使用率监控脚本

# 获取内存使用率
function get_memory_usage {
    # 获取内存使用率
    MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
    
    echo "内存使用率:$MEMORY_USAGE%"
}

# 监控内存使用率
echo "===== 内存使用率监控 ====="
get_memory_usage

使用方法

bash
# 赋予执行权限
chmod +x memory_usage_monitor.sh

# 执行脚本
./memory_usage_monitor.sh

3.2 交换空间监控

监控交换空间使用率。

脚本

bash
#!/bin/bash
# 交换空间监控脚本

# 获取交换空间使用率
function get_swap_usage {
    # 获取交换空间使用率
    SWAP_USAGE=$(free | grep Swap | awk '{printf "%.2f", $3/$2 * 100.0}')
    
    echo "交换空间使用率:$SWAP_USAGE%"
}

# 监控交换空间使用率
echo "===== 交换空间监控 ====="
get_swap_usage

使用方法

bash
# 赋予执行权限
chmod +x swap_usage_monitor.sh

# 执行脚本
./swap_usage_monitor.sh

3.3 内存详细信息监控

监控内存详细信息。

脚本

bash
#!/bin/bash
# 内存详细信息监控脚本

# 获取内存详细信息
function get_memory_detail {
    echo "===== 内存详细信息监控 ====="
    
    # 获取内存信息
    free -h
}

# 监控内存详细信息
get_memory_detail

使用方法

bash
# 赋予执行权限
chmod +x memory_detail_monitor.sh

# 执行脚本
./memory_detail_monitor.sh

4. 磁盘监控脚本

4.1 磁盘使用率监控

监控磁盘使用率。

脚本

bash
#!/bin/bash
# 磁盘使用率监控脚本

# 获取磁盘使用率
function get_disk_usage {
    echo "===== 磁盘使用率监控 ====="
    
    # 获取磁盘使用率
    df -h | grep -vE '^Filesystem|tmpfs|cdrom'
}

# 监控磁盘使用率
get_disk_usage

使用方法

bash
# 赋予执行权限
chmod +x disk_usage_monitor.sh

# 执行脚本
./disk_usage_monitor.sh

4.2 磁盘IO监控

监控磁盘IO。

脚本

bash
#!/bin/bash
# 磁盘IO监控脚本

# 获取磁盘IO
function get_disk_io {
    echo "===== 磁盘IO监控 ====="
    
    # 获取磁盘IO
    iostat -x 1 1
}

# 监控磁盘IO
get_disk_io

使用方法

bash
# 赋予执行权限
chmod +x disk_io_monitor.sh

# 执行脚本
./disk_io_monitor.sh

4.3 磁盘空间告警

磁盘空间告警。

脚本

bash
#!/bin/bash
# 磁盘空间告警脚本

# 配置
THRESHOLD=80
EMAIL="admin@example.com"

# 检查磁盘空间
function check_disk_space {
    echo "===== 磁盘空间告警 ====="
    
    # 检查磁盘空间
    df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line
    do
        # 获取磁盘使用率
        DISK_USAGE=$(echo "$line" | awk '{print $5}' | sed 's/%//')
        
        # 检查是否超过阈值
        if [ $DISK_USAGE -gt $THRESHOLD ]; then
            # 获取磁盘挂载点
            MOUNT_POINT=$(echo "$line" | awk '{print $6}')
            
            # 发送告警
            MESSAGE="磁盘空间告警:$MOUNT_POINT 使用率:$DISK_USAGE%"
            echo "$MESSAGE"
            echo "$MESSAGE" | mail -s "磁盘空间告警" "$EMAIL"
        fi
    done
}

# 检查磁盘空间
check_disk_space

使用方法

bash
# 赋予执行权限
chmod +x disk_space_alert.sh

# 执行脚本
./disk_space_alert.sh

5. 网络监控脚本

5.1 网络流量监控

监控网络流量。

脚本

bash
#!/bin/bash
# 网络流量监控脚本

# 获取网络流量
function get_network_traffic {
    echo "===== 网络流量监控 ====="
    
    # 获取网络接口
    INTERFACES=$(ip link show | grep -E '^[0-9]+:' | awk '{print $2}' | sed 's/://')
    
    # 获取每个网络接口的流量
    for interface in $INTERFACES
    do
        # 获取接收流量
        RX_BYTES=$(cat /sys/class/net/$interface/statistics/rx_bytes)
        RX_MB=$((RX_BYTES / 1024 / 1024))
        
        # 获取发送流量
        TX_BYTES=$(cat /sys/class/net/$interface/statistics/tx_bytes)
        TX_MB=$((TX_BYTES / 1024 / 1024))
        
        echo "网络接口:$interface,接收流量:${RX_MB}MB,发送流量:${TX_MB}MB"
    done
}

# 监控网络流量
get_network_traffic

使用方法

bash
# 赋予执行权限
chmod +x network_traffic_monitor.sh

# 执行脚本
./network_traffic_monitor.sh

5.2 网络连接监控

监控网络连接。

脚本

bash
#!/bin/bash
# 网络连接监控脚本

# 获取网络连接
function get_network_connections {
    echo "===== 网络连接监控 ====="
    
    # 获取网络连接统计
    ESTABLISHED=$(ss -s | grep ESTAB | awk '{print $2}')
    TIME_WAIT=$(ss -s | grep TIME-WAIT | awk '{print $2}')
    
    echo "ESTABLISHED连接数:$ESTABLISHED"
    echo "TIME-WAIT连接数:$TIME_WAIT"
}

# 监控网络连接
get_network_connections

使用方法

bash
# 赋予执行权限
chmod +x network_connections_monitor.sh

# 执行脚本
./network_connections_monitor.sh

5.3 网络端口监控

监控网络端口。

脚本

bash
#!/bin/bash
# 网络端口监控脚本

# 配置
PORTS=(22 80 443 3306)

# 检查网络端口
function check_network_ports {
    echo "===== 网络端口监控 ====="
    
    # 检查每个端口
    for port in "${PORTS[@]}"
    do
        # 检查端口是否开放
        if ss -tuln | grep -q ":$port "; then
            echo "端口 $port:开放"
        else
            echo "端口 $port:关闭"
        fi
    done
}

# 检查网络端口
check_network_ports

使用方法

bash
# 赋予执行权限
chmod +x network_ports_monitor.sh

# 执行脚本
./network_ports_monitor.sh

6. 进程监控脚本

6.1 进程数量监控

监控进程数量。

脚本

bash
#!/bin/bash
# 进程数量监控脚本

# 获取进程数量
function get_process_count {
    # 获取进程数量
    PROCESS_COUNT=$(ps aux | wc -l)
    
    echo "进程数量:$PROCESS_COUNT"
}

# 监控进程数量
echo "===== 进程数量监控 ====="
get_process_count

使用方法

bash
# 赋予执行权限
chmod +x process_count_monitor.sh

# 执行脚本
./process_count_monitor.sh

6.2 特定进程监控

监控特定进程。

脚本

bash
#!/bin/bash
# 特定进程监控脚本

# 配置
PROCESS_NAME="nginx"

# 检查特定进程
function check_process {
    # 检查进程是否存在
    if pgrep -x "$PROCESS_NAME" > /dev/null; then
        # 获取进程数量
        PROCESS_COUNT=$(pgrep -x "$PROCESS_NAME" | wc -l)
        
        # 获取进程ID
        PROCESS_IDS=$(pgrep -x "$PROCESS_NAME")
        
        echo "进程 $PROCESS_NAME:运行中"
        echo "进程数量:$PROCESS_COUNT"
        echo "进程ID:$PROCESS_IDS"
    else
        echo "进程 $PROCESS_NAME:未运行"
    fi
}

# 检查特定进程
echo "===== 特定进程监控 ====="
check_process

使用方法

bash
# 赋予执行权限
chmod +x process_monitor.sh

# 执行脚本
./process_monitor.sh

6.3 进程资源监控

监控进程资源使用情况。

脚本

bash
#!/bin/bash
# 进程资源监控脚本

# 配置
PROCESS_NAME="nginx"

# 检查进程资源
function check_process_resource {
    echo "===== 进程资源监控 ====="
    echo "进程:$PROCESS_NAME"
    
    # 检查进程是否存在
    if pgrep -x "$PROCESS_NAME" > /dev/null; then
        # 获取进程资源使用情况
        ps aux | grep "$PROCESS_NAME" | grep -v grep
    else
        echo "进程 $PROCESS_NAME:未运行"
    fi
}

# 检查进程资源
check_process_resource

使用方法

bash
# 赋予执行权限
chmod +x process_resource_monitor.sh

# 执行脚本
./process_resource_monitor.sh

7. 实时监控脚本

7.1 实时系统监控

实时监控系统状态。

脚本

bash
#!/bin/bash
# 实时系统监控脚本

# 配置
INTERVAL=5

# 实时监控系统状态
function real_time_monitor {
    echo "===== 实时系统监控 ====="
    echo "监控间隔:${INTERVAL}秒"
    echo "按Ctrl+C退出"
    echo ""
    
    # 实时监控
    while true
    do
        # 获取当前时间
        CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
        
        # 获取CPU使用率
        CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
        
        # 获取内存使用率
        MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
        
        # 获取磁盘使用率
        DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
        
        # 获取网络连接数
        NETWORK_CONNECTIONS=$(ss -s | grep ESTAB | awk '{print $2}')
        
        # 获取进程数量
        PROCESS_COUNT=$(ps aux | wc -l)
        
        # 输出监控信息
        echo "[$CURRENT_TIME] CPU:$CPU_USAGE% | 内存:$MEMORY_USAGE% | 磁盘:$DISK_USAGE% | 网络:$NETWORK_CONNECTIONS | 进程:$PROCESS_COUNT"
        
        # 等待
        sleep $INTERVAL
    done
}

# 实时监控
real_time_monitor

使用方法

bash
# 赋予执行权限
chmod +x real_time_monitor.sh

# 执行脚本
./real_time_monitor.sh

7.2 监控告警

监控告警脚本。

脚本

bash
#!/bin/bash
# 监控告警脚本

# 配置
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80
EMAIL="admin@example.com"
INTERVAL=60

# 监控告警
function monitor_alert {
    echo "===== 监控告警 ====="
    echo "CPU阈值:$CPU_THRESHOLD%"
    echo "内存阈值:$MEMORY_THRESHOLD%"
    echo "磁盘阈值:$DISK_THRESHOLD%"
    echo "告警间隔:${INTERVAL}秒"
    echo ""
    
    # 监控告警
    while true
    do
        # 获取CPU使用率
        CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
        
        # 获取内存使用率
        MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
        
        # 获取磁盘使用率
        DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
        
        # 检查CPU使用率
        if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
            MESSAGE="CPU使用率告警:$CPU_USAGE%"
            echo "[$(date)] $MESSAGE"
            echo "$MESSAGE" | mail -s "CPU使用率告警" "$EMAIL"
        fi
        
        # 检查内存使用率
        if (( $(echo "$MEMORY_USAGE > $MEMORY_THRESHOLD" | bc -l) )); then
            MESSAGE="内存使用率告警:$MEMORY_USAGE%"
            echo "[$(date)] $MESSAGE"
            echo "$MESSAGE" | mail -s "内存使用率告警" "$EMAIL"
        fi
        
        # 检查磁盘使用率
        if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then
            MESSAGE="磁盘使用率告警:$DISK_USAGE%"
            echo "[$(date)] $MESSAGE"
            echo "$MESSAGE" | mail -s "磁盘使用率告警" "$EMAIL"
        fi
        
        # 等待
        sleep $INTERVAL
    done
}

# 监控告警
monitor_alert

使用方法

bash
# 赋予执行权限
chmod +x monitor_alert.sh

# 执行脚本
./monitor_alert.sh

8. 实战案例

案例1:综合监控系统

场景:实现一个综合监控系统,包括CPU、内存、磁盘、网络、进程监控。

脚本

bash
#!/bin/bash
# 综合监控系统

# 配置
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80
EMAIL="admin@example.com"
MONITOR_TYPE="$1"

# CPU监控
function cpu_monitor {
    echo "===== CPU监控 ====="
    
    # 获取CPU使用率
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    
    echo "CPU使用率:$CPU_USAGE%"
    
    # 检查CPU使用率
    if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
        MESSAGE="CPU使用率告警:$CPU_USAGE%"
        echo "$MESSAGE"
        echo "$MESSAGE" | mail -s "CPU使用率告警" "$EMAIL"
    fi
}

# 内存监控
function memory_monitor {
    echo "===== 内存监控 ====="
    
    # 获取内存使用率
    MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
    
    echo "内存使用率:$MEMORY_USAGE%"
    
    # 检查内存使用率
    if (( $(echo "$MEMORY_USAGE > $MEMORY_THRESHOLD" | bc -l) )); then
        MESSAGE="内存使用率告警:$MEMORY_USAGE%"
        echo "$MESSAGE"
        echo "$MESSAGE" | mail -s "内存使用率告警" "$EMAIL"
    fi
}

# 磁盘监控
function disk_monitor {
    echo "===== 磁盘监控 ====="
    
    # 获取磁盘使用率
    df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line
    do
        # 获取磁盘使用率
        DISK_USAGE=$(echo "$line" | awk '{print $5}' | sed 's/%//')
        
        # 获取磁盘挂载点
        MOUNT_POINT=$(echo "$line" | awk '{print $6}')
        
        echo "磁盘 $MOUNT_POINT 使用率:$DISK_USAGE%"
        
        # 检查磁盘使用率
        if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then
            MESSAGE="磁盘使用率告警:$MOUNT_POINT 使用率:$DISK_USAGE%"
            echo "$MESSAGE"
            echo "$MESSAGE" | mail -s "磁盘使用率告警" "$EMAIL"
        fi
    done
}

# 网络监控
function network_monitor {
    echo "===== 网络监控 ====="
    
    # 获取网络流量
    INTERFACES=$(ip link show | grep -E '^[0-9]+:' | awk '{print $2}' | sed 's/://')
    
    for interface in $INTERFACES
    do
        # 获取接收流量
        RX_BYTES=$(cat /sys/class/net/$interface/statistics/rx_bytes)
        RX_MB=$((RX_BYTES / 1024 / 1024))
        
        # 获取发送流量
        TX_BYTES=$(cat /sys/class/net/$interface/statistics/tx_bytes)
        TX_MB=$((TX_BYTES / 1024 / 1024))
        
        echo "网络接口 $interface 接收流量:${RX_MB}MB,发送流量:${TX_MB}MB"
    done
}

# 进程监控
function process_monitor {
    echo "===== 进程监控 ====="
    
    # 获取进程数量
    PROCESS_COUNT=$(ps aux | wc -l)
    
    echo "进程数量:$PROCESS_COUNT"
}

# 综合监控
function comprehensive_monitor {
    echo "===== 综合监控 ====="
    echo "监控时间:$(date)"
    echo ""
    
    cpu_monitor
    echo ""
    
    memory_monitor
    echo ""
    
    disk_monitor
    echo ""
    
    network_monitor
    echo ""
    
    process_monitor
}

# 根据监控类型执行监控
case "$MONITOR_TYPE" in
    cpu)
        cpu_monitor
        ;;
    memory)
        memory_monitor
        ;;
    disk)
        disk_monitor
        ;;
    network)
        network_monitor
        ;;
    process)
        process_monitor
        ;;
    comprehensive)
        comprehensive_monitor
        ;;
    *)
        echo "使用方法:$0 {cpu|memory|disk|network|process|comprehensive}"
        exit 1
        ;;
esac

echo "监控完成"

使用方法

bash
# 赋予执行权限
chmod +x comprehensive_monitor.sh

# 执行CPU监控
./comprehensive_monitor.sh cpu

# 执行内存监控
./comprehensive_monitor.sh memory

# 执行磁盘监控
./comprehensive_monitor.sh disk

# 执行网络监控
./comprehensive_monitor.sh network

# 执行进程监控
./comprehensive_monitor.sh process

# 执行综合监控
./comprehensive_monitor.sh comprehensive

课程总结

这节课我们学习了系统监控脚本实战。

核心内容:

  • 系统监控概述
  • CPU监控脚本(CPU使用率监控、CPU负载监控、CPU核心监控)
  • 内存监控脚本(内存使用率监控、交换空间监控、内存详细信息监控)
  • 磁盘监控脚本(磁盘使用率监控、磁盘IO监控、磁盘空间告警)
  • 网络监控脚本(网络流量监控、网络连接监控、网络端口监控)
  • 进程监控脚本(进程数量监控、特定进程监控、进程资源监控)
  • 实时监控脚本(实时系统监控、监控告警)
  • 实战案例

重要命令:

  • top:查看系统资源使用情况
  • free:查看内存使用情况
  • df:查看磁盘使用情况
  • iostat:查看磁盘IO
  • ss:查看网络连接
  • ps:查看进程
  • pgrep:查找进程

系统监控是运维工作的重要组成部分,掌握这些知识后,你将能够编写完整的系统监控脚本。

课后练习

练习1(基础)

编写一个CPU使用率监控脚本。

练习2(进阶)

编写一个内存使用率监控脚本。

练习3(拓展)

编写一个综合监控系统,包括CPU、内存、磁盘、网络、进程监控。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径