【发布时间】:2014-06-04 14:04:42
【问题描述】:
我一直在使用 linux 上的 proc 文件系统做一些事情,我遇到了一些我想澄清的行为。
/proc 中的每个进程都有一个指向其可执行文件/proc/{pid}/exe 的符号链接。如果一个进程在其可执行文件被删除后继续运行,读取此符号链接将返回可执行文件的路径,并在末尾附加(deleted)。
运行此命令,您甚至可能会在系统上看到一些命令:
grep '(deleted)' <(for dir in $(ls /proc | grep -E '^[0-9]+'); do echo "$dir $(readlink /proc/$dir/exe)"; done)
我尝试使用一些简单的 bash 命令重新创建此行为:
>>> echo "temporary file" >> tmpfile.test
>>> ln -s tmpfile.test tmpfile.link
>>> rm tmpfile.test
>>> readlink tmpfile.link
tmpfile.test
名字后面没有(deleted)!尝试cat tmpfile.link 确认链接已损坏 (cat: tmpfile.link: No such file or directory)。
但是,前几天,同样的测试确实导致(deleted) 被附加到 readlink 的输出中。什么给了?
这是我想知道的:
- 是否有一系列事件可以保证
(deleted)将 附加到名称后? - 为什么
/proc/{pid}/exe显示(deleted)用于删除的可执行文件? - 如何通过
/proc/{pid}/exe获取可执行文件的名称 没有任何附加(deleted)并保证原始 可执行文件不只是命名为some_executable (deleted)?
【问题讨论】: