#!/bin/bash # 定义颜色代码 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # 重置颜色 # 打印分隔线 echo -e "${GREEN}\n===== 系统基本信息 =====${NC}" echo "主机名: $(hostname)" echo "系统版本: $(cat /etc/redhat-release)" echo "运行时间: $(uptime | awk -F',' '{print $1}')" echo "当前时间: $(date '+%Y-%m-%d %H:%M:%S')" # CPU监控 echo -e "${GREEN}\n===== CPU状态 =====${NC}" echo "CPU型号: $(grep 'model name' /proc/cpuinfo | uniq | cut -d':' -f2)" echo "物理CPU数量: $(grep 'physical id' /proc/cpuinfo | sort | uniq | wc -l)" echo "逻辑CPU数量: $(grep 'processor' /proc/cpuinfo | wc -l)" echo -e "当前CPU使用率: ${YELLOW}$(mpstat 1 1 | awk '/Average/ {printf \"%d%%\", 100-$12}')${NC}" # 内存监控 echo -e "${GREEN}\n===== 内存状态 =====${NC}" free -m | awk ' /Mem/ {printf "总内存: %dMB 已用: %dMB 剩余: %dMB\n", $2, $3, $4} /Swap/ {printf "交换空间: %dMB 已用: %dMB 剩余: %dMB\n", $2, $3, $4}' # 磁盘监控 echo -e "${GREEN}\n===== 磁盘状态 =====${NC}" echo "磁盘空间使用情况:" df -h | grep -Ev 'tmpfs|devtmpfs' | awk '{printf "%-20s %-10s %-10s %-10s %s\n", $1, $2, $3, $4, $6}' echo -e "\n磁盘I/O状态:" iostat -d | awk ' BEGIN {print "设备\t\t每秒读取\t每秒写入"} $1 ~ /^sd/ {print $1 "\t\t" $3 "\t\t" $4}' # 进程与端口 echo -e "${GREEN}\n===== 进程与端口状态 =====${NC}" echo "占用CPU前5的进程:" ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head -n6 echo -e "\n监听中的TCP端口:" netstat -tuln | awk '/^tcp/ {split($4, a, ":"); printf "%-8s %-15s:%s\n", $1, a[1], a[2]}' # 异常检测 echo -e "${GREEN}\n===== 异常检测 =====${NC}" # 检测内存使用超过90% if (( $(free | awk '/Mem/{printf "%d", $3/$2*100}') > 90 )); then echo -e "${RED}警告: 内存使用超过90%!${NC}" fi # 检测根分区使用超过90% if (( $(df / | awk 'NR==2 {gsub(/%/,""); print $5}') > 90 )); then echo -e "${RED}警告: 根分区使用超过90%!${NC}" fi # 添加/home目录分析 echo -e "${GREEN}\n===== /home目录空间使用 =====${NC}" if [ -d "/home" ]; then echo "用户目录大小统计:" # 使用du统计一级子目录大小,按降序排序 du -h --max-depth=1 /home/ 2>/dev/null | sort -hr | awk ' BEGIN {printf "%-25s %-10s\n", "目录", "大小"} !/home\/$/ {gsub("/home/",""); printf "%-25s %-10s\n", $2, $1}' else echo "未找到/home目录" fi echo -e "${GREEN}\n===== 状态收集完成 ====="${NC}
时间: 2025-07-09 11:55:34 浏览: 13
<think>好的,我现在需要分析用户提供的这个bash脚本,并按照用户的要求进行详细介绍。用户希望结构清晰,分步骤解释,同时使用中文回答。首先,我要仔细阅读这个脚本,理解每一部分的功能,然后按照逻辑结构逐步拆解。
首先,脚本开头定义了颜色代码,用于后续的输出着色。这应该是为了让不同部分的信息更醒目。接下来,脚本打印系统基本信息,包括主机名、系统版本、运行时间和当前时间。这里需要注意的是,系统版本是通过读取/etc/redhat-release文件获取的,所以这个脚本可能主要针对Red Hat系列的Linux系统,比如CentOS或RHEL。
然后是CPU状态的检查,这里通过/proc/cpuinfo文件获取CPU型号、物理和逻辑核心数量,并使用mpstat命令获取当前CPU使用率。这里要注意mpstat的输出处理,特别是使用awk截取平均值的部分,可能需要检查是否正确计算了使用率。
内存监控部分使用free命令,并以MB为单位显示。这里awk脚本处理输出,显示总内存、已用和剩余,以及交换空间的情况。需要确认free -m的输出格式是否与awk的处理匹配,避免截取错误的列。
磁盘监控分为空间使用和I/O状态。df命令排除了tmpfs和devtmpfs文件系统,并以易读的格式显示。iostat命令用于显示磁盘I/O,但需要确认系统是否安装了sysstat包,否则iostat可能不可用。此外,iostat的输出处理是否正确,特别是设备名的匹配(如sd)是否适用于不同环境。
进程与端口部分显示占用CPU前五的进程和监听的TCP端口。ps命令的参数是否正确,排序是否合理。netstat命令查看监听端口,处理输出时拆分本地地址和端口是否正确,尤其是IPv6地址可能包含多个冒号的情况需要注意。
异常检测部分检查内存和根分区使用是否超过90%,并输出警告。这里使用了算术比较,需要确认语法是否正确,特别是在不同的shell环境下,比如是否使用bash特有的语法。
最后,脚本添加了/home目录的空间分析,使用du命令统计各用户目录大小,并按大小排序。这里需要处理权限问题,因为某些目录可能无法访问,所以有2>/dev/null来忽略错误输出。同时,awk处理时排除了/home自身目录,只显示子目录。
在解释过程中,需要指出每个部分的功能、使用的命令及其作用,可能的问题点(比如依赖特定发行版或命令),以及颜色代码的应用。同时,要确保按照用户的要求,结构清晰,分步骤讲解,使用中文,并且行内公式正确使用$...$,不过在这个脚本中可能涉及较少数学公式,但如果有变量或数值处理,需要正确应用格式。
可能需要注意的地方包括:检查命令的兼容性,例如在非Red Hat系统上cat /etc/redhat-release会出错;iostat可能需要安装;netstat在某些系统中被ss取代,但用户提供的脚本使用的是netstat;还有处理df和du时的权限问题。此外,颜色代码中的转义字符是否正确使用echo -e来启用转义。
总结来说,我需要将整个脚本分解为各个功能模块,逐一解释其目的、实现方式和潜在注意事项,帮助用户理解脚本的工作原理和可能遇到的问题。</think>让我们逐步分析这个Bash监控脚本的实现逻辑和功能模块:
$$注意:这个脚本主要针对Red Hat系Linux系统(CentOS/RHEL),部分命令在其他发行版中可能需要调整$$
一、颜色定义模块
```bash
RED='\033[0;31m' # 红色
GREEN='\033[0;32m' # 绿色
YELLOW='\033[0;33m' # 黄色
NC='\033[0m' # 颜色重置
```
* 使用ANSI转义码实现终端颜色输出
* 格式:`\033[格式代码m`
* 颜色代码:31=红,32=绿,33=黄,0=重置
二、系统基本信息模块
```bash
echo -e "${GREEN}\n===== 系统基本信息 =====${NC}"
echo "主机名: $(hostname)" # 获取主机名
echo "系统版本: $(cat /etc/redhat-release)" # 读取系统版本
```
* 使用`uptime`命令的过滤输出获取运行时间
* 通过`date`命令格式化当前时间
三、CPU监控模块
```bash
grep 'model name' /proc/cpuinfo | uniq | cut -d':' -f2
```
* 从/proc/cpuinfo提取CPU信息
* `mpstat`计算CPU使用率公式:
$$ \text{CPU使用率} = 100\% - \text{空闲率} $$
四、内存监控模块
```bash
free -m | awk '
/Mem/ {printf "总内存: %dMB 已用: %dMB 剩余: %dMB\n", $2, $3, $4}
/Swap/ {printf "交换空间: %dMB 已用: %dMB 剩余: %dMB\n", $2, $3, $4}'
```
* `-m`选项以MB为单位显示
* 通过awk精确解析free命令输出
五、磁盘监控模块
```bash
df -h | grep -Ev 'tmpfs|devtmpfs' # 排除临时文件系统
iostat -d | awk '$1 ~ /^sd/...' # 仅显示物理磁盘
```
* `df -h`以易读格式显示磁盘空间
* `iostat`显示磁盘I/O统计,需要安装sysstat包
六、进程与端口模块
```bash
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head -n6
netstat -tuln | awk '/^tcp/...'
```
* `ps --sort`按CPU使用率降序排序
* `netstat -tuln`显示所有监听端口
七、异常检测模块
```bash
(( $(free | awk '/Mem/{printf "%d", $3/$2*100}') > 90 ))
```
* 使用算术比较`(())`
* 内存使用率计算公式:
$$ \text{内存使用率} = \frac{\text{已用内存}}{\text{总内存}} \times 100\% $$
八、/home目录分析模块
```bash
du -h --max-depth=1 /home/ 2>/dev/null | sort -hr
```
* `--max-depth=1`只统计一级子目录
* `sort -hr`按人类可读格式逆序排序
潜在改进建议:
1. 增加网络连接状态监控(如`ss -s`)
2. 添加僵尸进程检测:`ps -eo stat | grep -c Z`
3. 使用`bc`命令进行浮点数计算提高精度
4. 添加日志记录功能
5. 设置阈值可配置参数
这个脚本通过组合常用系统工具,实现了快速系统状态检查,适合用于日常运维监控。实际使用时建议:
1. 添加执行权限:`chmod +x script.sh`
2. 通过crontab定期执行
3. 输出重定向到日志文件
4. 关键指标设置邮件报警
阅读全文
相关推荐




















