procfs 是什么
/proc 是内核暴露的虚拟文件系统,每个进程在 /proc/PID 下都有自己的一套视图:cmdline 是启动命令(参数用 NUL 分隔)、environ 是启动时的环境变量、cwd 与 exe 是指向工作目录与可执行文件的软链接、fd 目录列出打开的文件描述符、status 与 limits 给出状态与资源限制、wchan 显示当前阻塞的内核函数。这些信息比 ps 更原始也更完整,是排查「环境不对」「句柄泄漏」「进程卡在哪」的入口。进程一旦退出,对应目录立即消失,可疑进程要抢时间取证。
基本信息
| 适用平台 | Linux(procfs);macOS 没有 /proc,需借助其它工具 |
|---|---|
| 关键路径 | /proc/PID/cmdline、environ、cwd、exe、fd/、status、limits、wchan、stat |
| 读取要点 | cmdline 与 environ 以 NUL 分隔,需用 tr 或 xargs -0 转换后阅读 |
| 权限说明 | 普通用户只能读自己的进程,读其它用户进程需要 root |
| 系统级条目 | /proc/meminfo、/proc/cpuinfo、/proc/loadavg、/proc/uptime 提供整机信息 |
典型使用场景
- 核对真实启动参数:确认服务实际带的是哪些参数,与配置文档是否一致
- 排查环境变量来源:分清某个设置来自环境变量还是配置文件
- 句柄分析:统计 fd 数量,发现泄漏或已删除但未释放的文件
- 判断进程卡点:用 wchan 看它阻塞在哪个内核函数
- 确认资源限制:读 limits 得到进程实际生效的限制值
常用示例
常用示例
tr '\0' ' ' < /proc/1234/cmdline; echo # 完整命令行
tr '\0' '\n' < /proc/1234/environ | head # 启动时的环境变量
ls -l /proc/1234/cwd /proc/1234/exe # 工作目录与可执行文件
ls /proc/1234/fd | wc -l # 打开的文件描述符数量
cat /proc/1234/status | head -20 # 状态与内存概况
cat /proc/1234/limits # 实际生效的资源限制
cat /proc/1234/wchan; echo # 当前阻塞位置常用条目含义
| 条目 | 内容 | 用途 |
|---|---|---|
| cmdline | 启动命令与全部参数,NUL 分隔 | 核对真实启动参数 |
| environ | 启动时的环境变量,NUL 分隔 | 判断配置来自环境变量还是配置 |
| cwd 与 exe | 软链接,指向工作目录与可执行文件 | 确认运行的是哪个版本、哪个目录 |
| fd/ | 打开的文件描述符列表 | 统计句柄数量、发现删除后未释放的文件 |
| status 与 limits | 进程状态、内存与资源限制 | 与 ulimit 设置对照 |
| wchan | 当前阻塞的内核函数名 | 判断进程为何卡住 |
environ 只保存进程启动那一刻的环境变量。运行期间通过 export 新增或修改的变量不会体现在里面,用它推断运行时环境会出错。
进程退出后 /proc/PID 立刻消失。对疑似异常退出的进程,应尽快用脚本一次性抓取 cmdline、environ、fd 列表与 status,事后无法补取。