如何找到进程当前工作目录对应的挂载点?

如何找到进程当前工作目录对应的挂载点?

我有一个程序a. 输出逃离/tmp/测试。如果我列出/proc/$(pgrep a.out)/cwd,它是一个符号链接/tmp/测试

现在我绑定/mnt/其他测试/tmp/测试mount -o bind /mnt/othertest /tmp/test。因此,这个新安装和旧安装堆叠在一起/tmp/测试被隐藏。

尽管如此,自从a. 输出在 mount 命令之前启动,它可以访问旧路径。

我想解决的问题是如何知道一个进程是否西德设置/tmp/测试指的是来自的目录/mnt/其他测试或不。

对于打开的文件,这很容易,我可以使用FD信息进程伪文件系统并读取挂载ID,但我没有找到这样的信息西德。我可以检查进程的开始时间并将其与安装启动的时间进行比较,但由于可能存在分叉,它可能是错误的。

答案1

调用另一个目录并通过元组对它们进行stat(2)比较。/proc/PID/cwddevice:inode

示例(请注意,除非给出-L开关,否则stat(1)实用程序将执行lstat(2)系统调用而不是stat(2)):

$ mkdir -p /tmp/foo /tmp/bar /tmp/baz
$ cd /tmp/foo
$ echo $$
20890

# mount -B /tmp/bar /tmp/foo
# stat -Lc %d:%i /proc/20890/cwd
2055:1835959

# stat -Lc %d:%i "$(readlink /proc/20890/cwd)" /tmp/foo /tmp/bar
2055:1843068
2055:1843068
2055:1843068

# umount /tmp/foo
# stat -Lc %d:%i /tmp/foo
2055:1835959

就像 , 下的文件一样/proc/PID/fd/proc/PID/cwd不是真正的符号链接 - open(2),stat(2)等不会跟随其目标,而是直接作用于它所引用的实际对象。

相关内容