我知道进程打开的文件的文件描述符,但不知道进程 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