如何列出当前 bash 会话中打开的文件描述符(以及它们引用的文件)

如何列出当前 bash 会话中打开的文件描述符(以及它们引用的文件)

我正在交互式 bash 会话中运行。我已经使用 exec 创建了一些文件描述符,我想列出 bash 会话的当前状态。

有没有办法列出当前打开的文件描述符?

答案1

是的,这将列出所有打开的文件描述符:

$ ls -l /proc/$$/fd
total 0
lrwx------ 1 isaac isaac 64 Dec 28 00:56 0 -> /dev/pts/6
lrwx------ 1 isaac isaac 64 Dec 28 00:56 1 -> /dev/pts/6
lrwx------ 1 isaac isaac 64 Dec 28 00:56 2 -> /dev/pts/6
lrwx------ 1 isaac isaac 64 Dec 28 00:56 255 -> /dev/pts/6
l-wx------ 1 isaac isaac 64 Dec 28 00:56 4 -> /home/isaac/testfile.txt

当然,像往常一样:0是stdin,1是stdout,2是stderr。
在本例中,第四个是打开的文件(要写入)。

答案2

lsof -a -p $$

仅网络FD:

lsof -i -a -p $$

答案3

假设您想列出附加到任何终端的文件描述符,您可以使用lsof/fuser或类似的命令:

$ lsof -p $$ 2>/dev/null | awk '$NF ~ /\/pts\//'
bash    32406 foobar    0u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    1u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    2u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    3u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar  255u   CHR 136,31      0t0      34 /dev/pts/31

这些工具基本上是 parse /proc,所以你也可以访问/proc/$$/fd/,例如:

ls /proc/$$/fd/*

答案4

如果您碰巧需要图形解决方案,gnome-system-monitor可以让您查看进程打开的文件描述符。右键单击任何进程会打开上下文菜单,然后您可以单击Open Files。或者您可以只选择进程并按CTRL+ O

额外福利:三明治菜单中还有一个选项,可以按文件名搜索打开的文件

系统监视器截图

相关内容