lsof命令简介

lsof 简介

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境中一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof 命令解析

COMMAND    PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1         root  cwd       DIR              253,0       224         64 /
systemd      1         root  rtd       DIR              253,0       224         64 /
systemd      1         root  txt       REG              253,0   1482128   67418805 /usr/lib/systemd/systemd
systemd      1         root  mem       REG              253,0     20040   33619254 /usr/lib64/libuuid.so.1.3.0
...

lsof 输出各列信息的意义如下:

  • COMMAND: 进程的名称
  • PID: 进程标识符
  • USER: 进程所有者
  • FD: 文件描述符,应用程序通过文件描述符识别该文件。每个进程都有自己的文件描述符表,因此FD可能会重名
  • TYPE: 文件类型
  • DEVICE: 指定磁盘的名称
  • SIZE: 文件的大小
  • NODE: 索引节点(文件在磁盘上的标识)
  • NAME: 打开文件的确切名称

查看进程打开文件

  • 列出占用文件的进程
$ sudo lsof /home/mysql/
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    18522 mysql  cwd    DIR  253,0     4096 655378 /home/mysql
sudo    18544  root  cwd    DIR  253,0     4096 655378 /home/mysql
lsof    18545  root  cwd    DIR  253,0     4096 655378 /home/mysql
lsof    18546  root  cwd    DIR  253,0     4096 655378 /home/mysql

可配合 +d 选项,表示/home/mysql目录及目录下的文件,不包括子目录

$ sudo lsof /home/mysql/ +d
  • 列出pid打开的文件

-p选项,列出指定pid打开的文件,如果要多个,则用逗号隔开

$ sudo lsof -p 16273
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
nano    16273 root  cwd    DIR  253,0     4096 1179649 /root
  • 列出指定用户打开的文件

-u选项,列出指定用户打开的文件

$ sudo lsof -u test1
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    16335 test1  cwd    DIR  253,0     4096 1966556 /home/test1
  • 列出指定进程名打开的文件

-c 选项,列出指定进程名打开的文件

sudo lsof -c java   # 显示command列中以java的所有打开的文件

sudo lsof -c java -c sh  # 显示command列中以java开头或以sh开头的打开的文件

sudo lsof -c ^java   # 显示command列中所有不以java开头的打开的文件

查看网络连接情况

-i 选项,可以列出网络连接情况。语法格式如下:

lsof -i[46] [protocol] [@hostname|hostaddr] [:service|prot]

参数解析:
4/6:IPv4或IPv6
protocol:TCP或UDP
hostname:主机名
hostaddr:ip地址
service:/etc/service中服务名,可写多个
port:端口号,可写多个

示例:

1. 查看IPv4网络情况

$ lsof -i 4
COMMAND     PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind    1599       rpc    6u  IPv4  10168      0t0  UDP *:sunrpc 
rpcbind    1599       rpc    7u  IPv4  10169      0t0  UDP *:926 
...

2. 查看指定IP

-n 表示不进行IP域名反查,直接显示ip地址

$ lsof -i @10.0.137.144 -n
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    16734      root    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)
sshd    16736      test    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)

3. 查看指定IP及端口

$ sudo lsof -i @10.0.137.144:22 -n
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd    16734      root    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)
sshd    16736      test    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)

4. 查看指定端口

$ lsof -i :22 -n
COMMAND   PID      USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
sshd     1095      root    3u  IPv4    14032      0t0  TCP *:ssh (LISTEN)
sshd     1095      root    4u  IPv6    14034      0t0  TCP *:ssh (LISTEN)
sshd    16734      root    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)
sshd    16736      test    3u  IPv4 14692046      0t0  TCP 10.0.137.144:ssh->10.0.2.136:49614 (ESTABLISHED)

5. 查看指定协议

$ sudo lsof -i UDP
COMMAND    PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
rsyslogd 17935 root    3u  IPv4 11066422      0t0  UDP *:40296 
posted @ 2018-06-21 22:45  Pyerlife  阅读(...)  评论(...编辑  收藏