lsof, list open files.

用于查看打开的文件。一般使用该命令可以查看端口的使用进程,还可以用来查看 nginx, mysqld 相关进行正在使用的文件等。

1. 查看某文件正在被那些进程使用?

直接在命令后面加上相应的文件名就可以了。 lsof /some/file

sudo lsof /var/log/nginx/access.log
COMMAND   PID      USER   FD   TYPE DEVICE SIZE/OFF       NODE NAME
nginx   54320      root    2w   REG    1,4    35121 8633537136 error.log
nginx   54320      root    4w   REG    1,4    35121 8633537136 error.log
nginx   54322    nobody    2w   REG    1,4    35121 8633537136 error.log
nginx   54322    nobody    4w   REG    1,4    35121 8633537136 error.log
tail    64756 aaronflower  3r   REG    1,4    35121 8633537136 error.log

可以看到是 nginx, tail 进程在打开该文件,还可看到相应的 PID : 54322, 54320, 64756。

命令输出的每一个域说明:

  • COMMAND: 进程命令
  • PID : 进程号
  • USER: 启动进程的用户。
  • FD: File Description, 文件描述。
    • w:写
    • r:读
    • u: 读写
  • TYPE: 与该文件相关联的节点类型。常见的有:
    • CHR: 字符特殊文件。
    • REG : 一个常规文件。
    • IPv4: 一个 IPv4 socket.
    • IPv6: 一个 IPv6 socket.
  • NODE: 是一个编码,该编码可以是:
    • 文件在本地文件系统中的节点编码 (node number)
    • 文件在NFS 服务器中的节点编码(inode number)
    • 协议类型,如: TCP, UDP
    • 流,如:STR

2. 查看某进程打开了那些文件?

我们先找到对应的进程号。如找到 nginx 对应的进程号。然后查看其主进程打开了那些文件。

ps aux|grep nginx
nobody           54322   0.0  0.0  4300136   1736   ??  S     4:12PM   0:00.01 nginx: worker process
root             54320   0.0  0.0  4291452    556   ??  Ss    4:12PM   0:00.00 nginx: master process nginx

直接使用 -p 选项加上对应的 PID 就可以了。 lsof -p pid

sudo lsof -p 54320
COMMAND   PID USER   FD    TYPE             DEVICE SIZE/OFF       NODE NAME
nginx   54320 root  txt     REG                1,4  1100896 8633491812 /usr/lib/dyld
nginx   54320 root    0u    CHR                3,2      0t0        308 /dev/null
nginx   54320 root    1u    CHR                3,2      0t0        308 /dev/null
nginx   54320 root    2w    REG                1,4    41615 8633537136 /private/tmp/logs/error.log
nginx   54320 root    3u   unix 0xd147dfbe983cbcbf      0t0            ->0xd147dfbe983cdf1f
nginx   54320 root    4w    REG                1,4    41615 8633537136 /private/tmp/logs/error.log
nginx   54320 root    5w    REG                1,4    67959  118150373 /usr/local/var/log/nginx/access.log
nginx   54320 root    6u  systm 0xd147dfbea67f2f9f      0t0            [ctl com.apple.netsrc id 8 unit 18]
nginx   54320 root    7u   unix 0xd147dfbe983ccb97      0t0            ->0xd147dfbe983cbbf7
nginx   54320 root    8u   IPv4 0xd147dfbea5d5cfff      0t0        TCP *:8098 (LISTEN)
nginx   54320 root    9u   IPv4 0xd147dfbeb5f8967f      0t0        TCP *:xmltec-xmlmail (LISTEN)
nginx   54320 root   10u   IPv4 0xd147dfbea2d6797f      0t0        TCP *:radan-http (LISTEN)
nginx   54320 root   11u   unix 0xd147dfbe983cdf1f      0t0            ->0xd147dfbe983cbcbf

3. 该进程的 bin、log 文件在那里?

与相应的 grep 命令相接合使用,可以查看对应的 bin、log 文件。

sudo lsof -p 54320|grep bin
nginx   54320 root  txt     REG                1,4  1152404 8602545023 /usr/local/Cellar/nginx/1.13.10/bin/nginx
sudo lsof -p 54320|grep log
nginx   54320 root    2w    REG                1,4    41615 8633537136 /private/tmp/logs/error.log
nginx   54320 root    4w    REG                1,4    41615 8633537136 /private/tmp/logs/error.log
nginx   54320 root    5w    REG                1,4    67959  118150373 /usr/local/var/log/nginx/access.log

4. 查看某用户打开了那些文件?

查看用户打开了那些文件。lsof -u username

sudo lsof -u XXX
sudo lsof -u XXX -i

5. 查看端口被那个进程使用?

使用 -i 参数,可以查看 IPv4/IPv6 对应端口的使用情况。也可以指定协议。

sudo lsof -i :80
sudo lsof -i tcp

Refs:

  1. 8 Basic lsof Commands Every Sysadmin Needs to Know