简介
lost(list open files) 是一个列出当前系统打开文件的工具。
先来一段简单的介绍:
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。 注意:这里的“文件”不单指一般的文件,还包括目录、socket套接字、设备文件和命名管道。
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof 命令可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
我们可以直接在命令行键入 lsof -h 直接获取帮助。
直接键入 lsof | more (因为输出太多行,我们使用more)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 252,1 4096 2 /
init 1 root rtd DIR 252,1 4096 2 /
init 1 root txt REG 252,1 150352 3014667 /sbin/init
init 1 root mem REG 252,1 39896 262251 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 252,1 101920 262253 /lib64/libnih.so.1.0.0
init 1 root mem REG 252,1 154664 262147 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3787 /dev/null
init 1 root 1u CHR 1,3 0t0 3787 /dev/null
init 1 root 2u CHR 1,3 0t0 3787 /dev/null
init 1 root 3r FIFO 0,8 0t0 6543 pipe
init 1 root 4w FIFO 0,8 0t0 6543 pipe
init 1 root 5r DIR 0,10 0 1 inotify
init 1 root 6r DIR 0,10 0 1 inotify
说明:
lsof输出各列的信息意义如下
- COMMAND 进程名称(与文件相关联的进程名称)
- PID 进程id
- PPID 父进程标识符(需要指定-R参数)
- PGID 进程所属组(lsof -g 进程id)
- USER 拉起进程的用户
- FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt、数字等
- TYPE 文件类型,如DIR、REG等
- DEVICE 指示文件所在设备的设备号(major,minor)
- SIZE/OFF 指示文件的大小或进程对文件操作的偏移量
- NODE 索引节点(文件在磁盘上的标识)
- NAME 文件名
FD列常见的取值如下:
cwd:进程工作目录
txt:进程由该程序拉起
rtd:进程的根目录
mem:内存映射文件
N(u/w/r):指示该文件为进程打开的第N个文件描述符,u为可读可写模式,w为可写模式,r为可读模式(linux操作系统已经把0、1、2文件描述符分配给了标准输入、输出和错误流,所以大多数应用程序打开的文件的FD都是从3开始的)。
TYPE常见的类型如下:
REG :一般文件
DIR:目录
CHR :字符类型
UNIX: UNIX 域套接字
FIFO:命名管道(先进先出队列)
PIPE:管道
IPv4:网际协议 (IP) 套接字
根据以上字段,我们就可以了解到哪个文件以何种关联方式与哪个进程关联。
常用参数
lsof filename 显示开启文件filename的进程
lsof -c filename(进程名称) 显示进程filename打开的所有文件
lsof -p 123 显示进程号为123的进程打开的所有文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i:80 显示所有打开80端口的进程
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不止一个)
port --> 端口号 (可以不止一个)
示例
1、查看打开文件/dev/ptmx的进程
[root@dev-103 dev]# lsof /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 23017 root 8u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23017 root 10u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23017 root 11u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23180 root 8u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23180 root 10u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23180 root 11u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23211 root 8u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23211 root 10u CHR 5,2 0t0 5359 /dev/ptmx
sshd 23211 root 11u CHR 5,2 0t0 5359 /dev/ptmx
sshd 27590 root 8u CHR 5,2 0t0 5359 /dev/ptmx
sshd 27590 root 10u CHR 5,2 0t0 5359 /dev/ptmx
sshd 27590 root 11u CHR 5,2 0t0 5359 /dev/ptmx
2、查看进程server打开的文件
[root@dev-103 dev]# lsof -c server
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
server 27298 root cwd DIR 252,1 4096 1547 /data/test/socketecho
server 27298 root rtd DIR 252,1 4096 2 /
server 27298 root txt REG 252,1 9677 881 /data/test/socketecho/server
server 27298 root mem REG 252,1 1920936 262157 /lib64/libc-2.12.so
server 27298 root mem REG 252,1 154664 262147 /lib64/ld-2.12.so
server 27298 root 0u CHR 136,10 0t0 13 /dev/pts/10
server 27298 root 1u CHR 136,10 0t0 13 /dev/pts/10
server 27298 root 2u CHR 136,10 0t0 13 /dev/pts/10
server 27298 root 3u IPv4 346525 0t0 TCP *:muse (LISTEN)
server 27298 root 4u IPv4 346526 0t0 TCP localhost:muse->localhost:44422 (ESTABLISHED)
3、查看pid为27298的进程打开的文件
[root@dev-103 dev]# lsof -p 27298
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
server 27298 root cwd DIR 252,1 4096 1547 /data/test/socketecho
server 27298 root rtd DIR 252,1 4096 2 /
server 27298 root txt REG 252,1 9677 881 /data/test/socketecho/server
server 27298 root mem REG 252,1 1920936 262157 /lib64/libc-2.12.so
server 27298 root mem REG 252,1 154664 262147 /lib64/ld-2.12.so
server 27298 root 0u CHR 136,10 0t0 13 /dev/pts/10
server 27298 root 1u CHR 136,10 0t0 13 /dev/pts/10
server 27298 root 2u CHR 136,10 0t0 13 /dev/pts/10
server 27298 root 3u IPv4 346525 0t0 TCP *:muse (LISTEN)
server 27298 root 4u IPv4 346526 0t0 TCP localhost:muse->localhost:44422 (ESTABLISHED)
4、查看使用端口6888的进程
[root@dev-103 dev]# lsof -i:6888
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
server 27298 root 3u IPv4 346525 0t0 TCP *:muse (LISTEN)
server 27298 root 4u IPv4 346526 0t0 TCP localhost:muse->localhost:44422 (ESTABLISHED)
client 27638 root 3u IPv4 347811 0t0 TCP localhost:44422->localhost:muse (ESTABLISHED)
5、列出使用FD为4的所有进程
[root@dev-103 ~]# lsof -d 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root 4w FIFO 0,8 0t0 6543 pipe
master 1138 root 4u CHR 1,3 0t0 3787 /dev/null
qmgr 1153 postfix 4w FIFO 0,8 0t0 9295 pipe
php-fpm 1155 root 4w REG 252,1 620778 2359313 /data/logs/php-fpm/error.log
crond 1492 root 4u unix 0xffff88003bbaaac0 0t0 11390 socket
salt-mini 1561 root 4r CHR 1,9 0t0 3792 /dev/urandom
pickup 6927 postfix 4w FIFO 0,8 0t0 9295 pipe
sshd 7804 root 4w unix 0xffff88001202f440 0t0 410458 socket
server 7863 root 4u IPv4 415008 0t0 TCP localhost:muse->localhost:44457 (ESTABLISHED)
cleanup 8072 postfix 4w FIFO 0,8 0t0 9295 pipe
local 8074 postfix 4w FIFO 0,8 0t0 9295 pipe
以上只是介绍了lsof的常见用法,欢迎大家提供更好的使用方法。
参考
1、http://www.cnblogs.com/bangerlee/archive/2012/05/03/2464495.html
2、http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html
3、http://blog.csdn.net/Linux_ever/article/details/50789199
4、http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html