![如果知道某个进程打开的文件的文件描述符,如何在 Linux 命令上打印文件名?](https://linux22.com/image/1397639/%E5%A6%82%E6%9E%9C%E7%9F%A5%E9%81%93%E6%9F%90%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%89%93%E5%BC%80%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E5%91%BD%E4%BB%A4%E4%B8%8A%E6%89%93%E5%8D%B0%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%9F.png)
我知道进程打开的文件的文件描述符,但不知道进程 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