Linux-ToolKit-procps
2019-11-28 11:24:26 阿炯

procps全称为procps-ng: System and process monitoring utilities(/proc 文件系统工具)

此软件包提供了命令行和全屏实用程序用于浏览 procfs,该伪文件系统由内核动态生成,以提供进程表中条目状态的相关信息(例如进程是否在运行、停止或僵死)。它包含了 free, kill, pkill, pgrep, pmap, ps, pwdx, skill, slabtop,snice, sysctl, tload, top, uptime, vmstat, w, watch 等指令,有些可能要用root用户才能执行。


procps is a set of command line and full-screen utilities that provide information out of the pseudo-filesystem most commonly located at /proc.This filesystem provides a simple interface to the kernel data structures.The programs of procps generally concentrate on the structures that describe the processess running on the system.The following programs are found in procps:

关于 proc 伪文件系统

1、为何需要 /proc:设计初衷

在早期 Unix/Linux 系统中,内核状态和进程信息的获取依赖于专用工具(如 ps、top)或复杂的系统调用(如 ioctl)。这种方式存在以下问题:
1.接口碎片化
不同功能需要不同的工具或调用,缺乏统一接口。

2.实时性差
工具通常通过解析静态文件(如 /etc/passwd)或缓存数据,无法反映动态变化。

3.开发复杂度高
开发者需要深入理解内核结构和系统调用,调试困难。

/proc 的核心理念:将内核和进程的运行时状态抽象为虚拟文件,用户通过标准文件操作(cat、echo、read)即可与内核交互,实现“一切皆文件”的哲学。

2、历史脉络:从雏形到标准化

1984年:8th Edition Unix 首次引入 /proc,用于调试进程(每个进程对应一个目录),但功能有限。

1992年:Linux v0.96 借鉴并扩展了 /proc,不仅包含进程信息,还暴露硬件状态(CPU、内存、设备)和内核参数。

2000年后:随着 Linux 在服务器和嵌入式领域的普及,/proc 成为系统监控和调优的核心工具,并被 POSIX 标准部分采纳。

/proc 文件系统的设计源于早期 Unix 系统对动态内核数据访问的需求。传统文件系统仅用于存储静态数据,而操作系统内核的状态(如进程信息、硬件配置等)需要一种更灵活的交互方式。1984 年,Tom J. Killian 在 Unix 第八版中首次提出 /proc 的概念,将其作为进程信息伪文件系统,用于调试和监控进程。Linux 继承了这一理念,并在 1990 年代初期将其扩展为内核与用户空间的动态接口。随着 Linux 内核的演进,/proc 的功能逐渐丰富,不仅涵盖进程信息,还纳入了系统硬件状态、内核参数调整等能力。

2.1 核心特性与功能
/proc 是一个伪文件系统(Pseudo Filesystem),其文件和目录并非真实存储在磁盘上,而是由内核实时生成,仅存在于内存中。它的核心功能包括:

系统信息暴露:如 CPU 信息(/proc/cpuinfo)、内存状态(/proc/meminfo)。

进程管理:每个进程对应 /proc/[pid]/ 目录,包含命令行参数(cmdline)、环境变量(environ)等实时数据。

内核参数调整:通过 /proc/sys/ 目录动态修改网络、内存管理等参数(如 sysctl 命令的底层实现)。

硬件设备监控:如中断统计(/proc/interrupts)、设备挂载信息(/proc/mounts)。

2.2. 应用场景示例
性能监控:通过 /proc/stat 计算 CPU 利用率,或分析 /proc/net/dev 获取网络流量。

调试工具依赖:top、ps 等工具基于 /proc 数据实现进程状态展示。

动态调优:修改 /proc/sys/net/ipv4/tcp_syncookies 可防御 SYN 洪水攻击。

2.3、用户与内核的桥梁
/proc 以文件系统形式提供标准化访问接口,简化了用户态工具与内核的交互。

实时性与动态性:数据实时生成,无需重启即可生效,适合动态系统调试和优化。

生态系统依赖:大量系统工具(如 lsof、htop)和容器技术(如 Docker)依赖 /proc 获取底层信息。

3、核心功能与应用场景

1. 进程信息抽象
路径格式:/proc/[PID]/,例如 /proc/1/ 对应 init 进程。

关键文件
status:进程状态(内存、信号、用户ID)。
cmdline:启动命令参数。
fd/:进程打开的文件描述符。
maps:内存映射区域(如共享库)。

应用示例:
# 查看进程1的启动命令
cat /proc/1/cmdline
# 统计当前系统进程数
ls -d /proc/[0-9]* | wc -l

2. 硬件与内核状态
系统级信息:
/proc/cpuinfo:CPU型号、核心数、频率。
/proc/meminfo:内存总量、使用情况、缓存。
/proc/interrupts:中断分配统计。
/proc/net/dev:网络接口流量。

内核参数动态调整:
/proc/sys/
目录下的文件(如 net/ipv4/ip_forward)允许运行时修改内核参数。

# 启用IP转发(临时生效)
echo 1 > /proc/sys/net/ipv4/ip_forward

调试与性能分析
# 监控系统内存变化(每秒刷新)
watch -n 1 "cat /proc/meminfo | grep -i 'free\|available'"

分析进程资源
# 查看进程12345的内存映射(检测内存泄漏)
cat /proc/12345/maps

与其他伪文件系统的对比

虽然 Linux 后续引入了 sysfs(设备驱动模型)、cgroupfs(资源控制)等伪文件系统,但 /proc 仍是最核心的动态信息源。例如 sysfs 聚焦硬件设备层次结构,而 /proc 更侧重进程和内核状态。

4、Linux生态的“神经中枢”

统一接口:开发者无需依赖特定工具库,通过文件读写即可获取信息。
动态性:数据实时生成,反映系统瞬时状态(如 uptime 文件每秒变化)。
可扩展性:内核模块可通过 /proc 暴露自定义接口(需调用 proc_create())。
安全性:权限模型与普通文件一致(如 stat 文件仅 root 可读)。

5、局限性与发展

性能开销:频繁读取大文件(如 /proc/kallsyms)可能影响性能。
替代方案:Linux 4.0+ 引入 sysfs(/sys)和 debugfs,将设备驱动和调试信息从 /proc 剥离,保持其简洁性。
未来趋势:容器化场景下,/proc 需隔离(如 Kubernetes 中每个 Pod 看到独立的 /proc)。

6、proc 核心思维

“透明化”内核:通过文件系统抽象,降低系统管理的技术门槛。
“自省”能力:为开发者提供一把窥探内核的“瑞士军刀”。
“动态配置”典范:无需重启即可调整系统行为,奠定了 Linux 作为服务器操作系统的统治地位。


free
Report the amount of free and used memory in the system
报告系统中空闲和使用的内存容量(包括物理和交换内存)

kill
Send a signal to a process based on PID
根据名称和其它属性给进程发送信号

pgrep
List processes based on name or other attributes
根据名称和其它属性查找进程

pkill
Send a signal to a process based on name or other attributes
根据名称和其它属性给进程发送信号

pmap
Report memory map of a process
报告指定进程的内存映射情况

ps
Report information of processes
列出正在运行的进程

pwdx
Report current directory of a process
报告进程的当前工作目录

slabtop
Display kernel slab cache information in real time
实时显示内核 slab 缓存信息

snice
Renice a process
调整进程运行的运行优先级

sysctl
Read or Write kernel parameters at run-time
运行时修改内核参数

tload
Graphical representation of system load average
打印当前系统平均负载曲线图

top
Dynamic real-time view of running processes
显示最 CPU 密集型进程列表,它可以实时地连续查看处理器活动

uptime
Display how long the system has been running
报告系统运行时长、登录用户数目以及系统平均负载

vmstat
Report virtual memory statistics
报告虚拟内存统计信息、给出关于进程、内存、分页、块输入/输出(IO)、中断陷阱以及 CPU 活动的信息

w
Report logged in users and what they are doing
显示当前登录的用户、以及登录地点和时间

watch
Execute a program periodically, showing output fullscreen
重复运行指定命令,显示输出的第一个整屏;这允许用户查看随着时间的输出变化

libprocps
包含该软件包大部分程序使用的函数

项目主页:https://gitlab.com/procps-ng/procps