主题
系统监控脚本实战
课程介绍
系统监控是运维工作的重要组成部分,通过监控可以及时发现系统问题。本课程将通过实战案例,带你学习如何编写系统监控脚本,包括CPU监控、内存监控、磁盘监控、网络监控等核心功能。
1. 系统监控概述
1.1 什么是系统监控
系统监控是指对系统的运行状态进行实时监控。
系统监控的目的:
| 目的 | 说明 |
|---|---|
| 性能监控 | 监控系统性能 |
| 故障预警 | 预警系统故障 |
| 资源管理 | 管理系统资源 |
| 容量规划 | 规划系统容量 |
1.2 监控指标
系统监控有多种指标。
监控指标:
| 指标 | 说明 |
|---|---|
| CPU | CPU使用率、负载 |
| 内存 | 内存使用率、交换空间 |
| 磁盘 | 磁盘使用率、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.sh2.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.sh2.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.sh3. 内存监控脚本
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.sh3.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.sh3.3 内存详细信息监控
监控内存详细信息。
脚本:
bash
#!/bin/bash
# 内存详细信息监控脚本
# 获取内存详细信息
function get_memory_detail {
echo "===== 内存详细信息监控 ====="
# 获取内存信息
free -h
}
# 监控内存详细信息
get_memory_detail使用方法:
bash
# 赋予执行权限
chmod +x memory_detail_monitor.sh
# 执行脚本
./memory_detail_monitor.sh4. 磁盘监控脚本
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.sh4.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.sh4.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.sh5. 网络监控脚本
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.sh5.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.sh5.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.sh6. 进程监控脚本
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.sh6.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.sh6.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.sh7. 实时监控脚本
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.sh7.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.sh8. 实战案例
案例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:查看磁盘IOss:查看网络连接ps:查看进程pgrep:查找进程
系统监控是运维工作的重要组成部分,掌握这些知识后,你将能够编写完整的系统监控脚本。
课后练习
练习1(基础)
编写一个CPU使用率监控脚本。
练习2(进阶)
编写一个内存使用率监控脚本。
练习3(拓展)
编写一个综合监控系统,包括CPU、内存、磁盘、网络、进程监控。