前言
list open files)命令,用于列出当前系统已经打开的所有文件。lsof命令也可以查看端口是否在被占用。
在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表,这对系统监测以及排错是很有帮助的。
语法格式
lsof命令的语法有大量的参数,可以查看man文档,下面讲解一些比较常用的参数。
列出当前系统已经打开的所有文件
[root@nginx ~]# lsof |less #列出当前系统已经打开的所有文件,由于很多,所以使用less命令
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 4096 64 /
systemd 1 root rtd DIR 253,0 4096 64 /
systemd 1 root txt REG 253,0 1632744 4853402 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 19896 66856 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 1037577 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 50308 /usr/lib64/libpcre.so.1.2.0
lsof命令输出的各列的含义:
COMMAND: 进程的名称
PID: 进程标识符,pid
USER: 进程所有者
FD: 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE: 文件类型,REG表示文件,DIR表示目录,CHR表示字符,BLK表示块设备,UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
DEVICE: 以逗号分隔设备编号(磁盘名称)
SIZE: 文件的大小(bytes)
NODE: 索引节点(文件在磁盘上的标识)
NAME: 打开文件的确切名称
查看指定二进制文件在被哪个进程使用(很有用,用于查找可疑病毒文件查看开了哪些进程)
[root@nginx ~]# lsof /usr/local/nginx/sbin/nginx #查看哪个进程在使用/usr/local/nginx/sbin/nginx可执行文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1653 root txt REG 253,0 3982120 5998707 /usr/local/nginx/sbin/nginx
nginx 1654 nginx txt REG 253,0 3982120 5998707 /usr/local/nginx/sbin/nginx
nginx 1655 nginx txt REG 253,0 3982120 5998707 /usr/local/nginx/sbin/nginx
[root@nginx ~]#
查看端口对应的进程(最常用)
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
[root@iZwz94nju6ojdci4eii4p7Z ~]# lsof -i :22 #查看使用22号端口的进程
[root@iZwz94nju6ojdci4eii4p7Z ~]# lsof -i TCP:22 #查看使用tcp协议的22号端口进程
[root@iZwz94nju6ojdci4eii4p7Z ~]# lsof -i TCP #查看使用TCP协议打开的进程
查看某个进程打开了哪些文件
c<进程名>:列出指定进程所打开的文件;
[root@node2 ~]# lsof -c redis-server