列出打开的文件描述符
1.能用的文件描述符只有 9 个,你可能会觉得这没什么复杂的。但有时要记住哪个文件描述符被重定向到了哪里就没那么容易了。
lsof 命令会列出整个 Linux 系统打开的所有文件描述符,这包括所有后台进程以及登录用户打开的文件。
$ /usr/sbin/lsof -a -p $$ -d 0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 3344 rich 0u CHR 136,0 2 /dev/pts/0
bash 3344 rich 1u CHR 136,0 2 /dev/pts/0
bash 3344 rich 2u CHR 136,0 2 /dev/pts/0
$
2.lsof 的默认输出
COMMAND 进程对应的命令名的前 9 个字符
PID 进程的 PID
USER 进程属主的登录名
FD 文件描述符编号以及访问类型(r 代表读,w 代表写,u 代表读/写)
TYPE 文件的类型(CHR 代表字符型,BLK 代表块型,DIR 代表目录,REG 代表常规文件)
DEVICE 设备号(主设备号和从设备号)
SIZE 如果有的话,表示文件的大小
NODE 本地文件的节点号
NAME 文件名
$ cat test18
#!/bin/bash
# testing lsof with file descriptors
exec 3> test18file1
exec 6> test18file2
exec 7< testfile
/usr/sbin/lsof -a -p $$ -d0,1,2,3,6,7
$ ./test18
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
test18 3594 rich 0u CHR 136,0 2 /dev/pts/0
test18 3594 rich 1u CHR 136,0 2 /dev/pts/0
test18 3594 rich 2u CHR 136,0 2 /dev/pts/0
18 3594 rich 3w REG 253,0 0 360712 /home/rich/test18file1
18 3594 rich 6w REG 253,0 0 360715 /home/rich/test18file2
18 3594 rich 7r REG 253,0 73 360717 /home/rich/testfile
$
个脚本创建了 3 个替代性文件描述符,两个用作输出(3 和 6),一个用作输入(7)。
在脚本运行 lsof 命令时,你会在输出中看到新的文件描述符。我们去掉了输出中的第一部分,这样就能看到最终的文件名了。
文件名显示了文件描述符所使用文件的完整路径。每个文件都显示为 REG 类型,说明这些是文件系统中的常规文件。