Linux 的 /proc/self 指的是谁?——通过对比 Bash 和 awk 的 PID 来理解

Linux・CLI・DevOpsカテゴリを表すパンダのイラスト Linux・CLI・DevOps

关于本文
本文是通过生成式 AI 辅助的自动化流程创建的。在查阅 Linux 内核的 procfs 资料以及现有的已执行 Daily-Code-Samples 的基础上,/proc/self 指向的是谁,我们将通过安全的只读操作来进行观察。

验证状态:🧪 已在 Debian 13 / Bash 5.2.37 上本地确认,Ubuntu 实机未确认

/proc 并非普通的磁盘文件夹排列,而是内核以类似文件的形式展示进程和系统状态的虚拟文件系统。首先,我们只读取自身的 PID,/proc/self 来观察它一些意料之外的行为。

首先运行

可能包含机密信息的 /proc/*/environ 我们不会去触碰。statusName/Pid/PPid 我们只读取这部分。

echo "[SHELL] Bash PID = $$"

echo '[OBSERVE 1] /proc/$$/status'
awk '/^(Name|Pid|PPid):/ {print}' "/proc/$$/status"

echo '[OBSERVE 2] /proc/self/status'
awk '/^(Name|Pid|PPid):/ {print}' /proc/self/status

procfs 的基础知识可以在 Linux 内核文档中查阅。

查看这里

在第一个例子中,Pid 与 Bash 自身的 $$ 相匹配。然而在第二个例子中,根据环境的不同,它变成了 Name: awk,其 Pid 也与 Bash 不同。

因为 /proc/self 中的 self 指的不是“编写命令的 Shell”,而是实际引用该路径的进程。在此例中,awk 正在打开 /proc/self/status

flowchart LR
    B["Bash PID = $$"] --> A[awkを起動]
    A --> P["/proc/self/status をopen"]
    P --> K["Kernel / procfs"]
    K --> R[awk自身のPidを返す]

尝试修改一处

这次我们不使用 self,而是显式指定 Bash 的 PID。

cat "/proc/$$/cmdline" | tr '' ' '
echo

/proc/$$由于固定了目标 PID,因此即使其他进程的 cat 去读取,其引用的依然是 Bash。

为什么看起来像个文件

procfs 是向用户空间公开内核内部信息的接口。status 在读取时,与其认为是在打开一个已保存的文本文件,不如理解为“内核将当前状态以文件形式呈现出来”,这样更容易理解。

理解了这个思路后,ps 以及监控工具背后 Linux 公开了哪些信息就会变得更容易追踪。

如果在工作中实际使用

/proc 包含许多便利的信息,但并不意味着什么都可以输出到文章或日志中。

  • /proc/*/environ 可能包含环境变量和机密信息

  • 其他用户的进程其外观可能会因权限和挂载(mount)设置而异

  • 瞬间结束的 PID 会在观察过程中消失

  • 这是 Linux 特有的机制,请勿直接套用到其他操作系统上

在进行故障排查时,仅读取必要的数据项会更加安全。

GitHub 示例

现有示例展示了 [START] / [OBSERVE] / [SUCCESS],并避开了读取机密信息的路径。

官方信息与一手资料

总结

/proc/<PID> 表示指定的进程,/proc/self 表示引用该路径的进程自身。哪怕只是做个小型读取实验,也能亲身体验到 Linux 是如何将内核状态作为类似文件的接口来公开的。

文档信息

文章??
Linux 的 /proc/self 指的是谁?——通过对比 Bash 和 awk 的 PID 来理解
?布日期
更新日期
来源
https://papanda925.com/?p=15333&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制