Linux

如何找到程序的目前工作目錄對應的掛載點?

  • August 27, 2019

我有一個從*/tmp/test執行的程序a.out*。如果我列出,它是*/tmp/test*的符號連結。/proc/$(pgrep a.out)/cwd

現在,我將*/mnt/othertest綁定到/tmp/testmount -o bind /mnt/othertest /tmp/test。因此,這個新的掛載被堆疊起來,而舊的/tmp/test*被隱藏了。

儘管如此,由於a.out在 mount 命令之前啟動,它可以訪問舊路徑。

我要解決的問題是如何知道cwd設置為*/tmp/test的程序是否引用/mnt/othertest*中的目錄。

對於打開的文件,這很容易,我可以使用proc pseudo -filesyste 中的**fdinfo並讀取掛載 ID,但我沒有找到cwd的此類資訊。我可以檢查程序的開始時間並將其與 mount 啟動的時間進行比較,但由於可能存在分叉,它可能是錯誤的。

呼叫另一個目錄並通過元組比較stat(2)它們。/proc/PID/cwd``device:inode

範例(請注意,除非給出-L開關,否則該stat(1)實用程序將執行lstat(2)系統呼叫而不是 a 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)等不會跟隨它的目標,而是直接作用於它所指的實際對象。

引用自:https://unix.stackexchange.com/questions/537533