如果知道某个进程打开的文件的文件描述符,如何在 Linux 命令上打印文件名?

如果知道某个进程打开的文件的文件描述符,如何在 Linux 命令上打印文件名?

我知道进程打开的文件的文件描述符,但不知道进程 ID。如果我知道进程打开的文件的文件描述符,如何从 Linux 命令提示符打印文件名?

答案1

如果你不知道进程 ID,则必须检查全部进程具有相同 fd# 的打开文件,因为文件描述符是不是全局唯一。 fd# 越小,打开它的进程就越多(例如,在我的系统上,即使 fd# 大约为 30,我仍然需要猜测 15 个进程,如果我寻找 10 左右的 fd#,那么列表中将有 ~170 个进程)。

proc 文件系统将文件描述符显示为下的符号链接。/proc/<pid>/fd

# ls -l /proc/1/fd
lrwx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/0 -> /dev/null
lrwx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/1 -> /dev/null
lrwx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/2 -> /dev/null
l-wx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/3 -> /dev/kmsg
lrwx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/4 -> anon_inode:[eventpoll]
lrwx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/5 -> anon_inode:[signalfd]
lr-x------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/6 -> /sys/fs/cgroup/systemd/
...ETC...

例如,在所有进程中查找 fd #5:

# ls -l /proc/*/fd/5
lrwx------ 1 root root 64 2 月 12 日 22:10 /proc/1/fd/5 -> anon_inode:[signalfd]
lrwx------ 1 root root 64 2 月 12 日 22:15 /proc/129/fd/5 -> socket:[6980]
lrwx------ 1 root root 64 2 月 12 日 22:15 /proc/168/fd/5 -> 套接字:[7847]
lrwx------ 1 root root 64 2 月 12 日 22:15 /proc/341/fd/5 -> anon_inode:[eventfd]
lr-x------ 1 root root 64 2 月 12 日 22:15 /proc/342/fd/5 -> anon_inode:inotify
...ETC...

解析符号链接目标的确切接口是readlink()

# 读取链接 /proc/427529/fd/7
/home/grawity/lib/dotfiles/vim/backup/%home%grawity%.bashrc.swp

答案2

来自lsof 手册页

要查找打开 /u/abe/foo 的进程,请使用:

lsof /u/abe/foo

也可以看看本教程lsof这些提示lsof

相关内容