一、为什么要采集系统信息

在日常运维工作中,我们经常需要了解服务器的详细配置信息。无论是排查问题、性能优化,还是做容量规划,掌握准确的系统信息都是第一步。想象一下,当你接手一台陌生的服务器,第一件事可能就是想知道它有多少CPU、多大内存、什么操作系统版本。

手动一条条命令查看当然可以,但如果管理几十上百台服务器,这种方法就太费时费力了。这时候,写一个自动采集系统信息的Shell脚本就显得特别实用。

二、基础信息采集脚本

我们先从一个最简单的脚本开始,逐步完善它。这个脚本可以获取操作系统、内核版本、CPU和内存等基本信息。

#!/bin/bash
# 技术栈:Bash Shell脚本

# 获取系统基本信息
echo "====== 系统基本信息 ======"
echo "主机名: $(hostname)"
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2)"
echo "内核版本: $(uname -r)"
echo "系统架构: $(arch)"

# 获取CPU信息
echo -e "\n====== CPU信息 ======"
echo "CPU型号: $(grep "model name" /proc/cpuinfo | head -n 1 | cut -d ':' -f 2 | sed 's/^[ \t]*//')"
echo "CPU核心数: $(grep -c "processor" /proc/cpuinfo)"
echo "CPU频率: $(grep "cpu MHz" /proc/cpuinfo | head -n 1 | cut -d ':' -f 2 | sed 's/^[ \t]*//') MHz"

# 获取内存信息
echo -e "\n====== 内存信息 ======"
total_mem=$(free -h | grep Mem | awk '{print $2}')
used_mem=$(free -h | grep Mem | awk '{print $3}')
echo "总内存: $total_mem"
echo "已用内存: $used_mem"

这个脚本使用了常见的Linux命令:

  • hostname 获取主机名
  • /etc/os-release 文件包含系统发行版信息
  • uname -r 获取内核版本
  • /proc/cpuinfo 包含CPU详细信息
  • free -h 以人类可读格式显示内存使用情况

三、进阶信息采集脚本

现在我们来扩展脚本,加入磁盘、网络、负载等更多信息采集功能。

#!/bin/bash
# 技术栈:Bash Shell脚本

# 获取磁盘信息
echo -e "\n====== 磁盘信息 ======"
echo "磁盘使用情况:"
df -h | grep -v "tmpfs" | grep -v "udev"

# 获取挂载点详细信息
echo -e "\n挂载点详细信息:"
mount | grep "^/dev"

# 获取网络信息
echo -e "\n====== 网络信息 ======"
echo "IP地址:"
ip addr show | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}'

echo -e "\n网络接口:"
ip link show | grep "^[0-9]:" | awk -F': ' '{print $2}'

# 获取系统负载
echo -e "\n====== 系统负载 ======"
echo "当前负载: $(uptime | awk -F'load average: ' '{print $2}')"
echo "运行时间: $(uptime -p)"

这个扩展版本增加了:

  • df -h 查看磁盘使用情况
  • mount 查看挂载点详情
  • ip addrip link 查看网络配置
  • uptime 查看系统负载和运行时间

四、专业版信息采集脚本

对于更专业的运维需求,我们可以采集更多细节信息,并将结果保存到文件中。

#!/bin/bash
# 技术栈:Bash Shell脚本

# 定义输出文件
REPORT_FILE="system_report_$(date +%Y%m%d_%H%M%S).txt"

# 函数:打印分隔线
function print_separator {
    echo -e "\n$1\n" | tee -a $REPORT_FILE
}

# 收集系统信息
print_separator "====== 系统概览 ======"
{
    echo "采集时间: $(date)"
    echo "主机名: $(hostname)"
    echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2)"
    echo "内核版本: $(uname -r)"
    echo "系统架构: $(arch)"
    echo "启动时间: $(who -b | awk '{print $3,$4}')"
} | tee -a $REPORT_FILE

# 收集硬件信息
print_separator "====== 硬件信息 ======"
{
    echo "CPU型号: $(lscpu | grep "Model name" | cut -d ':' -f 2 | sed 's/^[ \t]*//')"
    echo "CPU核心数: $(nproc)"
    echo "总内存: $(free -h | grep Mem | awk '{print $2}')"
    echo "内存插槽信息:"
    dmidecode -t memory | grep -A5 "Memory Device" | grep -E "Size:|Locator:"
} | tee -a $REPORT_FILE

# 收集存储信息
print_separator "====== 存储信息 ======"
{
    echo "磁盘分区:"
    lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
    echo -e "\n文件系统使用情况:"
    df -hT | grep -v tmpfs
} | tee -a $REPORT_FILE

# 收集网络信息
print_separator "====== 网络信息 ======"
{
    echo "IP地址:"
    ip -br addr show
    echo -e "\n路由表:"
    ip route show
    echo -e "\n开放的TCP端口:"
    ss -tulnp | grep LISTEN
} | tee -a $REPORT_FILE

# 收集系统性能信息
print_separator "====== 系统性能 ======"
{
    echo "当前负载: $(uptime)"
    echo -e "\n进程资源占用TOP5:"
    ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 6
} | tee -a $REPORT_FILE

echo -e "\n系统信息采集完成,报告已保存到: $REPORT_FILE"

这个专业版脚本特点:

  1. 使用函数封装重复代码
  2. 将结果同时输出到屏幕和文件
  3. 使用更专业的命令如 lscpu, dmidecode, ss
  4. 包含更详细的硬件和性能信息
  5. 自动生成带时间戳的报告文件

五、脚本使用技巧与优化

1. 定时自动执行

我们可以使用crontab设置定期执行脚本:

# 每天凌晨1点执行信息采集
0 1 * * * /path/to/your/script.sh

2. 远程执行脚本

在多台服务器上执行脚本:

# 使用ssh批量执行
for server in server1 server2 server3; do
    ssh $server "bash -s" < /path/to/your/script.sh
done

3. 结果分析处理

采集到的信息可以进一步处理分析:

# 统计所有服务器的CPU核心数
grep "CPU核心数" *.txt | awk '{sum+=$2} END {print "总核心数:", sum}'

# 找出内存使用超过80%的服务器
grep -A1 "文件系统使用情况" *.txt | grep -E "[8-9][0-9]%|100%"

六、应用场景分析

  1. 服务器巡检:定期采集系统信息,形成巡检报告
  2. 故障排查:快速获取系统状态,辅助问题诊断
  3. 容量规划:收集资源使用数据,为扩容提供依据
  4. 资产盘点:统计服务器硬件配置,建立资产清单
  5. 配置比对:比较不同服务器的配置差异

七、技术优缺点

优点

  • 轻量级,无需安装额外软件
  • 灵活可定制,可以根据需求调整采集内容
  • 兼容性好,适用于大多数Linux发行版
  • 执行速度快,几乎不影响系统性能

缺点

  • 不同Linux发行版命令输出可能有差异
  • 部分硬件信息需要root权限才能获取
  • 结果需要人工解读,缺乏可视化

八、注意事项

  1. 权限问题:部分命令如dmidecode需要root权限
  2. 兼容性问题:不同Linux发行版的命令和文件路径可能有差异
  3. 敏感信息:采集的信息可能包含敏感内容,注意保护
  4. 执行频率:频繁执行可能影响系统性能
  5. 存储空间:长期保存报告会占用磁盘空间

九、总结

通过Shell脚本采集系统信息是运维工作中的一项基础但重要的技能。本文从简单到复杂展示了三种不同级别的信息采集脚本,涵盖了系统、硬件、存储、网络等关键信息。掌握这些技巧可以大大提高运维效率,特别是在管理大量服务器时。

随着需求的增加,你可以进一步扩展脚本功能,比如:

  • 添加邮件通知功能,自动发送报告
  • 将结果存入数据库,方便查询分析
  • 开发Web界面,实现可视化展示
  • 增加异常检测,自动告警

记住,好的运维工具都是从解决实际问题的小脚本开始的。希望本文能为你提供一个有用的起点。