Ubuntu下读取/proc/[pid]/stat出现ENOENT错误的问题排查
问题解答
这些不是僵尸进程,具体原因和逻辑如下:
僵尸进程的核心特征是:进程已终止但父进程未调用
wait()类接口回收,此时/proc/[pid]目录会保留,但stat等文件内容会呈现固定的僵尸进程标识格式,不会出现「消失又重现」的情况,和你遇到的现象完全不符。你碰到的是PID复用+内核工作线程(kworker)生命周期极短的时序问题:
- 程序通过
opendir/readdir遍历/proc拿到PID时,对应的kworker进程确实存在; - kworker是内核用于处理异步任务的临时线程,任务完成后会立即退出,其PID会被系统回收并重新分配(Linux的PID是循环复用的,达到上限后会从低位重新分配);
- 当你调用
open访问该PID对应的stat文件时,原kworker已退出,而新分配到该PID的进程可能还未完成初始化(/proc下的进程文件是内核动态生成的,进程初始化完成后才会创建对应的stat文件),或者此时该PID暂时无对应进程,因此返回ENOENT错误; - 手动用
cat能看到内容,是因为执行命令的时机和程序运行时机不同——执行cat时,该PID已被分配给一个完成初始化的新进程,对应的/proc/[pid]/stat文件已生成。
- 程序通过
另外,sudo执行结果一致,说明问题和权限无关,完全是进程生命周期与PID复用导致的时序差异。
内容的提问来源于stack exchange,提问作者acho
相关产品推荐
相关产品推荐

