cd into `/proc/xxx` 即使没有进程也能工作

gue*_*ter 2 proc

今天我发现/proc文件夹有些奇怪。有一个 PID (7825),我无法通过 将其视为正在运行的进程ps,我在制作时也看不到进程 ID,ls /proc但我可以看到它,ls /proc/7825也可以 cd 进入它。这里的输出:

# ls /proc

...
dr-xr-xr-x   9 xxxxxxx         xxxxxxx             0 May 16 20:57 7812
dr-xr-xr-x   9 xxxxxxx         xxxxxxx             0 May 16 20:52 7820
dr-xr-xr-x   9 root            root                0 May 16 20:52 7836
dr-xr-xr-x   9 root            root                0 May 16 20:52 786
dr-xr-xr-x   9 xxxxxxx         xxxxxxx             0 May 16 20:57 7923
dr-xr-xr-x   9 xxxxxxx         xxxxxxx             0 May 16 20:52 7924
...
Run Code Online (Sandbox Code Playgroud)
ps aux | grep [7]825

[EMPTY RESULT]
Run Code Online (Sandbox Code Playgroud)
ls /proc/7825
attr    clear_refs  coredump_filter  environ  fdinfo   largest_task  make-it-fail  mem        mountstats  oom_adj        pagemap      root       setgroups  stat    syscall        timerslack_ns  weight
auxv    cmdline     cpuset           exe      gid_map  limits        map_files     mountinfo  net         oom_score      personality  schedstat  smaps      statm   task           uid_map
cgroup  comm        cwd              fd       io       loginuid      maps          mounts     ns          oom_score_adj  projid_map   sessionid  stack      status  time_in_state  wchan
Run Code Online (Sandbox Code Playgroud)

为什么此 PID 可用于ls /proc/7825但未显示在psos 中ls /proc

这对我的程序来说非常关键,因为我必须检查某个 PID(上次运行的)是否仍在运行(检查是否/proc/[LAST_RUN_PID]/exe存在)。如果是这样,我认为之前的运行是“仍在运行”。今天我们遇到了一个问题,/proc/7825/exe即使没有程序运行,文件仍然存在(几个小时)。

有人可以详细说明为什么/如何发生这种情况吗?

Sté*_*las 5

ps在 Linux 上获取其信息,/proc因此他们的信息不会真正不同。即使不正确的 pid/mount 命名空间设置意味着/proc代表的信息不是来自当前 pid 命名空间,ps也会报告相同的错误信息。

在这里,7825 很可能是某个其他进程的线程,您会在 的输出中看到它ps -ALf,其中-L告诉ps报告所有线程(轻量级进程),而不仅仅是进程。