lsof 命令
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