lsof是list open files
的缩写。顾名思义,其作用是列出当前系统下所有打开的文件。
因为linux的一切皆文件
的设计哲学,像socket,进程等,在系统中都会被视为文件
。
参数含义
[~]# lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
systemd 1 root rtd DIR 253,1 4096 2 /
systemd 1 root txt REG 253,1 1478184 397653 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,1 20032 401603 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,1 252704 401631 /usr/lib64/libblkid.so.1.1.0
每一列表示的含义分别是:
COMMAD: 命令
PID:进程id
TID:线程id
USER:用户
FD:文件描述符,比如:cwd当前工作目录;txt程序代码;0标准输入;1标准输出;2标准错误
TYPE:node类型,比如:sock即socket;DIR目录;IPv4等。
DEVICE:磁盘名
SIZE/OFF:文件大小
NODE:文件标识
NAME:文件名称
-a other-options
表示and(并且的关系)后面需跟至少1个option选项,默认是option选项的并集,加上-a后,取的是交集
-p {pid}
列出进程id为{pid}的所有文件
-d [fd][^fd]
列出所有fd列满足条件(包含或不包含[^])的文件。
比如列出不是txt类型的文件 -d ^txt。(txt表示程序代码,二进制文件或共享库)
-D {dir}
列出目录{dir}下打开的文件
+D {dir}
递归列出目录{dir}下打开的文件
-i [46][protocol][@hostname|hostaddr][:service|port]
列出满足条件的文件(与网络相关)
-u [user][^user]
列出用户打开的文件,比如 -u ^root
,表示列出非root用户打开的文件
-n
显示时禁止转换成host名称,即显示ip。
-c {command}
显示通过{command}执行的进程所打开的文件
用法示例
判断端口是否处于监听状态
[~]# lsof -i :30200
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7970 root 264u IPv4 73771077 0t0 TCP *:30200 (LISTEN)
使用netstat -nlp | grep :30200
命令也能达到同样效果。
列出进程在访问的已删除文件
[~]# lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
systemd-j 346 root txt REG 253,1 278808 0 397790 /usr/lib/systemd/systemd-journald;58a43c2a (deleted)
systemd-l 468 root txt REG 253,1 584560 0 397448 /usr/lib/systemd/systemd-logind;58a43c2a (deleted)
java 3374 root 4r REG 253,1 526844 0 403168 /mnt/deploy/slave.jar (deleted)
+L[number], 会列出链接数量比number小的文件,所以+L1表示链接数量小于1,也就是没有链接的文件。
列出文件占用情况
lsof /dev/random:列出哪些进程在使用/dev/random(用于产生随机数)