在许多Linux发行版上需要手动安装procinfo:
# Debian/Ubuntu
sudo apt-get install procinfo
# RHEL/CentOS/Fedora
sudo yum install procinfo
# 或
sudo dnf install procinfo
# Arch Linux
sudo pacman -S procinfo
# 检查是否安装成功
procinfo --version
procinfo [选项]
| 选项 | 说明 |
|---|---|
-a |
显示所有信息 |
-b |
简要模式,只显示基本信息 |
-d |
显示磁盘统计信息 |
-i |
显示中断信息 |
-m |
显示内存信息 |
-n N |
连续运行N次后退出 |
-r |
显示内存统计(RAW格式) |
-s |
显示内核统计信息 |
-S |
显示交换分区信息 |
-t |
显示终端统计信息 |
-v |
显示版本信息 |
-h 或 --help |
显示帮助信息 |
显示完整的系统状态信息:
procinfo -a
这会显示包含多个部分的详细信息:
使用简要模式显示基本信息:
procinfo -b
输出示例:
Linux 5.15.0-76-generic (ubuntu) (console)
Total Memory: 8032 MB
Used Memory: 3256 MB (40.5%)
Free Memory: 4776 MB (59.5%)
Swap Total: 2048 MB
Swap Used: 0 MB (0.0%)
Uptime: 5 days, 3:25:16
Load Average: 0.12, 0.08, 0.05
专门显示内存使用情况:
procinfo -m
或者使用RAW格式:
procinfo -r
输出示例:
Memory:
Total RAM: 8032 MB
Free RAM: 4776 MB
Shared: 245 MB
Buffers: 256 MB
Cached: 1234 MB
Active: 2345 MB
Inactive: 876 MB
Swap: 2048 MB total, 0 MB used
查看系统的中断和DMA通道使用情况:
procinfo -i
输出示例:
Interrupts:
IRQ 0: timer (system timer)
IRQ 1: i8042 (keyboard controller)
IRQ 8: rtc0 (real time clock)
IRQ 9: acpi (SCI)
IRQ 12: i8042 (PS/2 mouse)
IRQ 16: nvidia (GPU)
IRQ 18: ehci_hcd:usb1 (USB controller)
...
DMA channels:
DMA 4: cascade
查看磁盘I/O统计:
procinfo -d
输出示例:
Disk:
sda:
Reads: 12345 (100.3 MB)
Writes: 6789 (50.2 MB)
Read sectors: 205600
Write sectors: 80400
sdb:
Reads: 234 (1.5 MB)
Writes: 567 (3.8 MB)
Read sectors: 3200
Write sectors: 7800
使用-n选项连续运行多次:
# 每隔1秒刷新,连续显示5次
watch -n 1 'procinfo -b'
# 或者使用procinfo自身的-n选项
procinfo -n 5 -b
watch命令效果更好
使用procinfo收集系统性能数据:
#!/bin/bash
# 系统性能监控脚本
LOG_FILE="/var/log/system_performance.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "=== 系统性能报告 ($DATE) ===" >> $LOG_FILE
echo "" >> $LOG_FILE
# 收集基本信息
echo "系统基本信息:" >> $LOG_FILE
procinfo -b >> $LOG_FILE
echo "" >> $LOG_FILE
# 收集内存详情
echo "内存详细信息:" >> $LOG_FILE
procinfo -m | grep -E "(Total|Free|Used|Swap)" >> $LOG_FILE
echo "" >> $LOG_FILE
# 收集磁盘统计
echo "磁盘I/O统计:" >> $LOG_FILE
procinfo -d | head -20 >> $LOG_FILE
echo "" >> $LOG_FILE
echo "报告已保存到: $LOG_FILE"
tail -50 $LOG_FILE
定期检查服务器健康状况:
#!/bin/bash
# 服务器健康检查脚本
check_system_health() {
echo "正在检查系统健康状况..."
echo ""
# 检查内存使用率
MEM_INFO=$(procinfo -m)
TOTAL_MEM=$(echo "$MEM_INFO" | grep "Total RAM" | awk '{print $3}')
FREE_MEM=$(echo "$MEM_INFO" | grep "Free RAM" | awk '{print $3}')
if [[ -n "$TOTAL_MEM" && -n "$FREE_MEM" ]]; then
MEM_USAGE=$(( (TOTAL_MEM - FREE_MEM) * 100 / TOTAL_MEM ))
echo "内存使用率: $MEM_USAGE%"
if [ $MEM_USAGE -gt 90 ]; then
echo "警告: 内存使用率过高!"
fi
fi
# 检查交换空间使用
SWAP_USED=$(echo "$MEM_INFO" | grep "Swap used" | awk '{print $3}')
if [[ -n "$SWAP_USED" && "$SWAP_USED" != "0" ]]; then
echo "警告: 正在使用交换空间 ($SWAP_USED MB)"
fi
# 检查系统负载
LOAD_AVG=$(procinfo -b | grep "Load Average" | cut -d: -f2)
echo "系统负载: $LOAD_AVG"
# 检查运行时间
UPTIME=$(procinfo -b | grep "Uptime" | cut -d: -f2-)
echo "运行时间: $UPTIME"
}
# 执行检查
check_system_health
使用procinfo进行系统故障排查:
#!/bin/bash
# 系统故障诊断脚本
diagnose_system() {
echo "开始系统诊断..."
echo ""
# 1. 检查中断冲突
echo "1. 中断检查:"
procinfo -i | grep -E "(IRQ|DMA)" | head -20
echo ""
# 2. 检查内存泄漏
echo "2. 内存状态检查:"
procinfo -m | grep -E "(Active|Inactive|Slab|PageTables)"
echo ""
# 3. 检查磁盘I/O异常
echo "3. 磁盘I/O检查:"
procinfo -d
echo ""
# 4. 检查内核统计
echo "4. 内核统计检查:"
procinfo -s | head -15
echo ""
# 5. 检查终端状态
echo "5. 终端状态检查:"
procinfo -t
}
# 生成诊断报告
diagnose_system > /tmp/system_diagnose_$(date +%Y%m%d_%H%M%S).log
| 字段/部分 | 说明 | 对应/proc文件 |
|---|---|---|
| Linux Version | 内核版本信息 | /proc/version |
| Uptime | 系统运行时间 | /proc/uptime |
| Load Average | 系统负载 | /proc/loadavg |
| Memory | 内存使用情况 | /proc/meminfo |
| CPU | CPU信息和统计 | /proc/cpuinfo, /proc/stat |
| Interrupts | 中断信息 | /proc/interrupts |
| Disk | 磁盘I/O统计 | /proc/diskstats |
| Kernel Statistics | 内核统计信息 | /proc/stat |
| Terminals | 终端信息 | /proc/tty/driver |
| Swap | 交换分区信息 | /proc/swaps |
| 命令 | 功能 | 特点 | 适用场景 |
|---|---|---|---|
procinfo |
综合系统信息显示 | 从/proc收集信息,格式友好 | 查看系统综合状态 |
cat /proc/* |
直接查看/proc文件 | 原始数据,信息最全 | 需要原始数据的场景 |
top / htop |
实时进程监控 | 动态刷新,交互式 | 实时监控进程 |
vmstat |
虚拟内存统计 | 专注于内存和CPU统计 | 内存性能分析 |
iostat |
磁盘I/O统计 | 详细的磁盘性能数据 | 磁盘性能分析 |
mpstat |
多CPU统计 | 每个CPU核心的统计 | 多核CPU分析 |
lscpu |
CPU架构信息 | CPU硬件信息 | CPU硬件详情 |
free |
内存使用信息 | 简单的内存统计 | 快速查看内存 |
procinfo命令:
直接查看/proc文件:
示例对比:
# procinfo查看内存
procinfo -m | grep "Total RAM"
# 直接查看/proc文件
cat /proc/meminfo | grep MemTotal
# procinfo查看CPU
procinfo | grep -A5 "CPU"
# 直接查看/proc文件
cat /proc/cpuinfo
cat /proc/stat
procinfo本身不支持JSON或CSV格式输出,但可以通过脚本转换:
转换为JSON:
#!/bin/bash
# 将procinfo输出转换为JSON格式
procinfo_to_json() {
echo "{"
# 系统信息
KERNEL=$(uname -r)
HOSTNAME=$(hostname)
echo " \"system\": {"
echo " \"kernel\": \"$KERNEL\","
echo " \"hostname\": \"$HOSTNAME\""
echo " },"
# 内存信息
MEM_INFO=$(procinfo -m)
TOTAL_RAM=$(echo "$MEM_INFO" | grep "Total RAM" | awk '{print $3}')
FREE_RAM=$(echo "$MEM_INFO" | grep "Free RAM" | awk '{print $3}')
echo " \"memory\": {"
echo " \"total_mb\": $TOTAL_RAM,"
echo " \"free_mb\": $FREE_RAM"
echo " },"
# 负载信息
LOAD=$(procinfo -b | grep "Load Average" | cut -d: -f2)
echo " \"load_average\": \"$LOAD\""
echo "}"
}
# 使用示例
procinfo_to_json
转换为CSV:
#!/bin/bash
# 将procinfo简要信息转换为CSV
echo "Timestamp,Total_Memory,Free_Memory,Load_Average"
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
MEM_INFO=$(procinfo -m)
TOTAL_RAM=$(echo "$MEM_INFO" | grep "Total RAM" | awk '{print $3}')
FREE_RAM=$(echo "$MEM_INFO" | grep "Free RAM" | awk '{print $3}')
LOAD=$(procinfo -b | grep "Load Average" | cut -d: -f2 | tr -d ' ')
echo "$TIMESTAMP,$TOTAL_RAM,$FREE_RAM,$LOAD"
sleep 5
done
procinfo显示的信息更新频率取决于:
1. /proc文件系统的特性:
2. 不同信息的更新频率:
| 信息类型 | 更新频率 | 说明 |
|---|---|---|
| 内存使用 | 实时 | 每次读取/proc/meminfo时更新 |
| CPU统计 | 实时 | /proc/stat中的CPU时间计数实时更新 |
| 磁盘统计 | 每次I/O操作后 | /proc/diskstats在每次I/O后更新 |
| 中断统计 | 每次中断发生时 | /proc/interrupts实时更新 |
| 系统负载 | 每5秒 | /proc/loadavg每5秒更新一次 |
| 运行时间 | 实时 | /proc/uptime每秒更新 |
实时监控示例:
# 使用watch命令实时监控
watch -n 1 procinfo -b
# 或者使用循环
while true; do
clear
procinfo -b
sleep 2
done
procinfo主要显示系统级信息,对于进程级信息,可以使用其他命令:
1. 查看进程的/proc信息:
# 查看进程1234的信息
ls -la /proc/1234/
# 查看进程状态
cat /proc/1234/status
# 查看进程内存映射
cat /proc/1234/maps
# 查看进程打开的文件
ls -l /proc/1234/fd/
2. 使用其他进程查看命令:
# 使用ps查看进程
ps aux | grep process_name
ps -ef --forest
# 使用top实时查看
top -p 1234
# 使用htop(需要安装)
htop
# 使用pstree查看进程树
pstree -p 1234
3. 结合procinfo和其他命令:
#!/bin/bash
# 查看系统状态和特定进程
PID=$1
if [ -z "$PID" ]; then
echo "使用方法: $0 PID"
exit 1
fi
echo "=== 系统状态 ==="
procinfo -b
echo ""
echo "=== 进程 $PID 信息 ==="
if [ -d "/proc/$PID" ]; then
echo "进程状态:"
head -20 /proc/$PID/status
echo ""
echo "进程命令行:"
cat /proc/$PID/cmdline | tr '\0' ' '
echo ""
else
echo "进程 $PID 不存在"
fi
#!/bin/bash
# 综合系统监控脚本
SYSLOG="/var/log/system_monitor_$(date +%Y%m%d).log"
# 收集系统信息
collect_system_info() {
echo "=== 时间: $(date) ===" >> $SYSLOG
echo "" >> $SYSLOG
# 1. 系统基本信息
echo "1. 系统基本信息:" >> $SYSLOG
uname -a >> $SYSLOG
echo "" >> $SYSLOG
# 2. procinfo简要信息
echo "2. 系统状态概要:" >> $SYSLOG
procinfo -b >> $SYSLOG
echo "" >> $SYSLOG
# 3. 内存详情
echo "3. 内存详细信息:" >> $SYSLOG
procinfo -m | head -15 >> $SYSLOG
echo "" >> $SYSLOG
# 4. 磁盘I/O统计
echo "4. 磁盘I/O统计:" >> $SYSLOG
procinfo -d >> $SYSLOG
echo "" >> $SYSLOG
# 5. 前10个CPU使用进程
echo "5. CPU使用最高的10个进程:" >> $SYSLOG
ps aux --sort=-%cpu | head -11 >> $SYSLOG
echo "" >> $SYSLOG
echo "=== 收集完成 ===" >> $SYSLOG
echo "" >> $SYSLOG
}
# 设置定时收集(示例:每小时收集一次)
# 在crontab中添加:
# 0 * * * * /path/to/this_script.sh
collect_system_info
echo "系统信息已收集到: $SYSLOG"