Linux procinfo 命令

procinfo 命令用于显示从/proc文件系统收集的系统状态信息,包括CPU、内存、进程、设备等详细信息
注意:procinfo命令可能不是所有Linux发行版都默认安装。它提供了一个比/proc更友好的界面来查看系统信息

安装方法

在许多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 显示帮助信息

命令示例

示例1:显示所有系统信息

显示完整的系统状态信息:

procinfo -a

这会显示包含多个部分的详细信息:

  • CPU信息和统计
  • 内存使用情况
  • 系统启动信息
  • 内核版本
  • 进程统计
  • 中断信息
示例2:显示简要系统信息

使用简要模式显示基本信息:

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
示例3:显示内存详细信息

专门显示内存使用情况:

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
示例4:显示中断和DMA信息

查看系统的中断和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
示例5:显示磁盘统计信息

查看磁盘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
示例6:连续监控系统状态

使用-n选项连续运行多次:

# 每隔1秒刷新,连续显示5次
watch -n 1 'procinfo -b'

# 或者使用procinfo自身的-n选项
procinfo -n 5 -b
提示:对于实时监控,使用watch命令效果更好

实际应用场景

场景1:系统性能监控脚本

使用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
场景2:服务器健康检查

定期检查服务器健康状况:

#!/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
场景3:故障排查和诊断

使用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

procinfo输出字段说明

字段/部分 说明 对应/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文件的信息
  • 提供筛选选项(-m, -d, -i等)
  • 适合日常监控和快速查看

直接查看/proc文件:

  • 原始数据,信息最完整
  • 需要手动解析和计算
  • 可以查看procinfo不包含的详细信息
  • 适合脚本处理和深入分析

示例对比:

# 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文件系统的特性:

  • /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

最佳实践

  1. 熟悉/proc文件系统:理解procinfo背后读取的/proc文件,便于深入分析
  2. 结合其他工具:procinfo适合快速查看,结合top、vmstat等工具进行深入分析
  3. 定期监控:建立定期系统健康检查机制,使用procinfo收集基线数据
  4. 脚本化监控:将procinfo集成到监控脚本中,自动收集和分析系统状态
  5. 了解信息更新机制:知道不同信息的更新频率,正确解读数据
  6. 注意权限:某些/proc文件需要root权限访问,procinfo可能显示不完整
  7. 版本差异:不同Linux发行版的procinfo版本可能略有差异,注意兼容性
  8. 数据存档:将重要的系统状态信息存档,便于历史分析和故障排查
#!/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"