一、为什么要采集系统信息
在日常运维工作中,我们经常需要了解服务器的详细配置信息。无论是排查问题、性能优化,还是做容量规划,掌握准确的系统信息都是第一步。想象一下,当你接手一台陌生的服务器,第一件事可能就是想知道它有多少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 addr和ip 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"
这个专业版脚本特点:
- 使用函数封装重复代码
- 将结果同时输出到屏幕和文件
- 使用更专业的命令如
lscpu,dmidecode,ss - 包含更详细的硬件和性能信息
- 自动生成带时间戳的报告文件
五、脚本使用技巧与优化
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%"
六、应用场景分析
- 服务器巡检:定期采集系统信息,形成巡检报告
- 故障排查:快速获取系统状态,辅助问题诊断
- 容量规划:收集资源使用数据,为扩容提供依据
- 资产盘点:统计服务器硬件配置,建立资产清单
- 配置比对:比较不同服务器的配置差异
七、技术优缺点
优点:
- 轻量级,无需安装额外软件
- 灵活可定制,可以根据需求调整采集内容
- 兼容性好,适用于大多数Linux发行版
- 执行速度快,几乎不影响系统性能
缺点:
- 不同Linux发行版命令输出可能有差异
- 部分硬件信息需要root权限才能获取
- 结果需要人工解读,缺乏可视化
八、注意事项
- 权限问题:部分命令如
dmidecode需要root权限 - 兼容性问题:不同Linux发行版的命令和文件路径可能有差异
- 敏感信息:采集的信息可能包含敏感内容,注意保护
- 执行频率:频繁执行可能影响系统性能
- 存储空间:长期保存报告会占用磁盘空间
九、总结
通过Shell脚本采集系统信息是运维工作中的一项基础但重要的技能。本文从简单到复杂展示了三种不同级别的信息采集脚本,涵盖了系统、硬件、存储、网络等关键信息。掌握这些技巧可以大大提高运维效率,特别是在管理大量服务器时。
随着需求的增加,你可以进一步扩展脚本功能,比如:
- 添加邮件通知功能,自动发送报告
- 将结果存入数据库,方便查询分析
- 开发Web界面,实现可视化展示
- 增加异常检测,自动告警
记住,好的运维工具都是从解决实际问题的小脚本开始的。希望本文能为你提供一个有用的起点。
评论