lsof命令
什么是lsof?
lsof是用于显示打开的文件
以及负责打开文件的过程的命令。没有传递任何参数,lsof
将列出所有正在运行的打开文件和关联的进程。lsof可用于识别当前打开了哪些端口以及由哪些进程打开,列出所有网络连接,列出当前正在访问目录或文件的用户和进程,以及识别正在利用文件系统内空间的进程。
如何在Ubuntu / Debian系统上安装lsof
sudo apt-get update sudo apt-get install lsof lsof -v
如何在RHEL / CentOS系统上安装lsof
yum info lsof yum install lsof lsof -v
如何在Fedora系统上安装lsof
dnf info lsof dnf install lsof lsof -v
lsof命令示例
列出所有打开的文件
[root@centos72m ~]# lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 4096 128 / systemd 1 root rtd DIR 253,0 4096 128 / systemd 1 root txt REG 253,1 1498184 4640738 /usr/lib/systemd/systemd systemd 1 root mem REG 253,1 20032 4226787 /usr/lib64/libuuid.so.1.3.0 systemd 1 root 1u CHR 1,3 0t0 4674 /dev/null systemd 1 root 2u CHR 1,3 0t0 4674 /dev/null
其中:
COMMAND正在运行的进程的名称
PID进程标识号
USER进程所有者
FD字段描述符
1. CWD 当前工作目录
2. RTD 根目录
3. TXT 文本文件
4. mem 内存映射文件
5. mmap 内存映射设备
6. 数字 表示文件描述符。在数字之后,用一个字符表示打开文件的模式:
7. 例如
8. 1u u =读访问和写访问
9. 1r r =读访问
10. 1w w =写访问
TYPE指定文件类型,例如:REG(普通文件),DIR(目录,FIFO(先进先出),CHR(字符特殊文件)
使用挂载点显示进程或用户
有时候,执行umount命令卸载文件系统时,提示当前目标或挂载点无法卸载,因为它处于繁忙状态(当前由进程/用户使用):
umount: /test: target is busy.
我们可以使用lsof
命令来确定使用此挂载点的用户和对象:
[root@centos72m /]# lsof /test COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1532 john cwd DIR 253,7 6 128 /test
我们可以看到有一个访问/test
目录的用户john
。他正在使用bash
shell访问。
列出在指定目录下打开文件的所有进程
[root@centos72m /]# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-j 479 root mem REG 253,5 8388608 6311998 /var/log/journal/1d65a007ef3549d7bd93a7030b7c50a6/system.journal systemd-j 479 root 20u REG 253,5 8388608 6311998 /var/log/journal/1d65a007ef3549d7bd93a7030b7c50a6/system.journal auditd 659 root 4w REG 253,5 2994544 4239523 /var/log/audit/audit.log
列出指定用户正在使用的所有文件
Linux如何查看用户正打开哪些文件?
查看john用户打开的文件
[root@centos72m /]# lsof -u john COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1532 john cwd DIR 253,7 6 128 /test bash 1532 john rtd DIR 253,0 4096 128 /
如何查看某个进程打开的文件
[root@centos72m /]# lsof -p 1591 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1591 john cwd DIR 253,4 79 131 /home/john
重复执行lsof命令。
-r
参数指定重复执行的时间间隔。 默认是15秒
下面示例,每5秒重复一次命令
[root@centos72m /]# lsof -p 1591 -r5 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1591 john cwd DIR 253,4 79 131 /home/john bash 1591 john rtd DIR 253,0 4096 128 / bash 1591 john txt REG 253,1 960392 54866 /usr/bin/bash ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1591 john cwd DIR 253,4 79 131 /home/john bash 1591 john rtd DIR 253,0 4096 128 /
列出系统上的所有网络连接
使用-i
参数列出系统上的所有网络连接lsof -i tcp
只查看TCP连接lsof -i udp
只查看UDP连接
[root@centos72m /]# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1266 root 3u IPv4 16882 0t0 TCP *:ssh (LISTEN) sshd 1266 root 4u IPv6 16891 0t0 TCP *:ssh (LISTEN) httpd 1269 root 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1345 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1346 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1347 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN)
列出特定端口上的连接
[root@centos72m /]# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1266 root 3u IPv4 16882 0t0 TCP *:ssh (LISTEN) sshd 1266 root 4u IPv6 16891 0t0 TCP *:ssh (LISTEN)
列出多个端口上的连接
[root@centos72m /]# lsof -i:22-25 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1266 root 3u IPv4 16882 0t0 TCP *:ssh (LISTEN) sshd 1266 root 4u IPv6 16891 0t0 TCP *:ssh (LISTEN) master 1351 root 13u IPv4 17362 0t0 TCP localhost:smtp (LISTEN) master 1351 root 14u IPv6 17363 0t0 TCP localhost:smtp (LISTEN) sshd 1378 root 3u IPv4 17706 0t0 TCP centos72m:ssh->192.168.0.23:37698 (ESTABLISHED)
查找指定的进程
[root@centos72m /]# lsof -i -a -c ssh COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1266 root 3u IPv4 16882 0t0 TCP *:ssh (LISTEN) sshd 1266 root 4u IPv6 16891 0t0 TCP *:ssh (LISTEN) sshd 1378 root 3u IPv4 17706 0t0 TCP centos72m:ssh->192.168.0.23:37698 (ESTABLISHED) [root@centos72m /]# lsof -i -a -c http COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 1269 root 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1708 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1709 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN)
查看ipv4和ipv6连接
[root@centos72m /]# lsof -i4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1266 root 3u IPv4 16882 0t0 TCP *:ssh (LISTEN) master 1351 root 13u IPv4 17362 0t0 TCP localhost:smtp (LISTEN) sshd 1378 root 3u IPv4 17706 0t0 TCP centos72m:ssh->192.168.0.23:37698 (ESTABLISHED) [root@centos72m /]# lsof -i6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1266 root 4u IPv6 16891 0t0 TCP *:ssh (LISTEN) httpd 1269 root 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1345 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN) httpd 1346 apache 4u IPv6 17198 0t0 TCP *:http (LISTEN)
定位没有释放磁盘空间的进程
有时,您可能会注意到df
命令报告文件系统中可用的空间更少。当您使用ls
和du
等常规命令查找占用空间的文件时,您会发现没有列出的文件占用空间。您不能明显地看到任何正在消耗空间的文件。lsof
命令可以帮助您识别占用空间的未链接文件。
编程中经常使用的一种技术是创建一个临时文件,然后断开该文件的链接。这种编码技术将把文件及其可用空间留给正在执行的程序。有时程序不能干净地退出,可能会让这些未链接的文件占用空间。要确定是否有进程持有未链接的文件,可以执行以下命令:lsof -a +L1 /your/filesystem
从输出中,您应该查找在NLINK列下具有00
值的任何进程。要释放这些进程占用的空间,需要杀死(终止)PID列下标识的进程。空间的大小可以在大小
标题列下确定。一旦进程被杀死,空间现在就可以使用了,并且将由df
命令正确地报告。
下面是一个来自lsof命令的输出示例,它显示了未链接的文件:
[root@wsaps01a dev]# lsof -a +L1 /websphere/v855/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME java 20002 wassvc 229r REG 253,4 0 0 264712 /websphere/v855/AppServer/profiles/WSS1/logs/server1/http_error.log (deleted) java 20002 wassvc 473r REG 253,4 15753828154 0 1062986 /websphere/v855/AppServer/profiles/WSS1/jdbc_error.log (deleted) java 20002 wassvc 486r REG 253,4 15753828154 0 1062986 /websphere/v855/AppServer/profiles/WSS1/jdbc_error.log (deleted)