因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
Linux下一切皆文件,lsof(lists openfiles)是一个列出当前系统打开文件的工具.文件可以是:
普通文件
目录
网络文件系统的文件
字符或设备文件
(函数)共享库
管道,命名管道
符号链接
网络文件(例如:NFS file、网络socket,unix域名socket)
还有其它类型的文件,等等
lsof常见参数如下:
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
lsof输出格式:
mckee@mckee-pc ~/program/go/src/sharedlogic (release) $ sudo lsof | more
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,3 4096 2 /
init 1 root rtd DIR 8,3 4096 2 /
init 1 root txt REG 8,3 265848 5767246 /sbin/init
init 1 root mem REG 8,3 47712 4985141 /lib/x86_64-linux-gnu/libnss_files-2.19.so
init 1 root mem REG 8,3 47760 4985151 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
init 1 root mem REG 8,3 97296 4985135 /lib/x86_64-linux-gnu/libnsl-2.19.so
init 1 root mem REG 8,3 39824 4985137 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
init 1 root mem REG 8,3 14664 4985082 /lib/x86_64-linux-gnu/libdl-2.19.so
lsof输出各列信息说明:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等,常见的文件类型:DIR:表示目录/CHR:表示字符类型/BLK:块设备类型/UNIX: UNIX 域套接字/FIFO:先进先出 (FIFO) 队列/IPv4:网际协议 (IP) 套接字
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
lsof部分示例:
(1)显示开启某个文件的进程
[root@mckee ~]# lsof /var/go/logs/access.log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
blog 4801 root 4u REG 3,1 41 132106 /var/go/logs/access.log
(2)显示某端口正在运行的程序
[root@mckee ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1605 mysql 11u IPv4 5143 0t0 TCP *:mysql (LISTEN)
(3)显示某个进程名正在打开的文件
[root@mckee ~]# lsof -c mysqld
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 1523 root cwd DIR 3,1 4096 2 /
mysqld_sa 1523 root rtd DIR 3,1 4096 2 /
mysqld_sa 1523 root txt REG 3,1 801816 4292633 /bin/bash
mysqld_sa 1523 root mem REG 3,1 144776 3375150 /lib64/ld-2.5.so
......
(4)显示某个进程号的进程打开了哪些文件
[root@mckee ~]# lsof -p 4801
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
blog 4801 root cwd DIR 3,1 4096 131242 /var/go
blog 4801 root rtd DIR 3,1 4096 2 /
blog 4801 root txt REG 3,1 11082256 132135 /var/go/blog
......
(5)显示某个用户正在打开的文件
[root@mckee ~]# lsof -u mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1605 mysql cwd DIR 3,1 4096 196613 /var/lib/mysql
mysqld 1605 mysql rtd DIR 3,1 4096 2 /
mysqld 1605 mysql txt REG 3,1 7744280 2961215 /usr/libexec/mysqld
......
(6)打印进程号
[root@mckee ~]# lsof -tc sshd
1453
19954
(7)列出所有tcp连接信息
[root@mckee ~]# lsof -i tcp