lsof命令

时间:2019-04-29 03:17:34  来源:igfitidea点击:

什么是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。他正在使用bashshell访问。

列出在指定目录下打开文件的所有进程

[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命令报告文件系统中可用的空间更少。当您使用lsdu等常规命令查找占用空间的文件时,您会发现没有列出的文件占用空间。您不能明显地看到任何正在消耗空间的文件。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)