Linux下 lsof 命令详解 linux -ls
liebian365 2024-10-31 15:19 6 浏览 0 评论
lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息,我们都知道,在Linux中,一切皆文件,lsof命令可以查看所有已经打开了的文件,比如: 普通文件,目录,特殊的块文件,管道,socket套接字,设备,Unix域套接字等等,同时,它还可以结合 grep 以及 ps 命令进行更多的高级搜索
安装
lsof 命令默认是没有安装的,而且它的使用需要有root权限或者赋予普通用于sudo权限, 使用以下命令安装
yum install -y lsof
lsof 命令有很多可选参数,本文根据我自己的使用经验整理了一些比较常用且重要的用法
列出所有打开的文件
不带任何参数执行 lsof 命令会输出当前所有活跃进程打开的所有文件
[root@ecs-centos-7 ~]# lsof | more
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
systemd 1 root rtd DIR 253,1 4096 2 /
systemd 1 root txt REG 253,1 1624520 530313 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,1 20064 528340 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,1 265600 532853 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,1 90248 525942 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,1 157424 525955 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,1 23968 526159 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,1 19896 526135 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,1 19288 525996 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,1 402384 525931 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,1 2156160
由于lsof命令会输出很多信息,所以上面例子中使用了 lsof | more 来分页显示命令输出结果
输出结果中,第一列中 systemd 的进程ID是 1,它是一个守护进程
其中列 COMMAND 、PID、USER 分别表示进程名、进程ID、所属用户
列 FD 是文件描述符,下面是可能的类型以及说明
FD | 说明 |
cwd | 当前目录 |
txt | txt文件 |
rtd | root目录 |
mem | 内存映射文件 |
列 TYPE 是文件类型,下面是可能的值以及说明
TYPE | 说明 |
DIR | 目录 |
REG | 普通文件 |
CHR | 字符 |
a_inode | Inode文件 |
FIFO | 管道或者socket文件 |
netlink | 网络 |
unknown | 未知 |
列 DEVICE 表示设备ID
列 SIZE/OFF 表示进程大小
列 NODE 表示文件的Inode号
列NAME 表示路径或者链接
列出指定用户已打开的文件
使用 -u 选项可以列出指定用户已经打开的文件,该选项后面可以接多个用户名,每个用户名之间用空格隔开,表示列出所有指定用户已打开的所有文件
[root@ecs-centos-7 ~]# lsof -u tt | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 27789 tt cwd DIR 253,1 4096 131090 /home/tt
bash 27789 tt rtd DIR 253,1 4096 2 /
bash 27789 tt txt REG 253,1 964600 525779 /usr/bin/bash
vim 27813 tt txt REG 253,1 2337192 531847 /usr/bin/vim
vim 27813 tt 4u REG 253,1 12288 131167 /home/tt/.p.txt.swp
上面的例子中,lsof -u tt 命令表示列出 tt 用户已经打开了的文件,从结果可以看出,用户打开了 /home/tt、/、/usr/bin/bash、/usr/bin/vim、/home/tt/.p.txt.swp 这几个文件
如果要排除指定用户已经打开的文件,可以在用户名前加 ^ 符号,下面的命令会列出除tt用户外其他所有用户已打开了的文件
lsof -u ^tt | more
找出打开着但已被删除了的文件
有这样一种场景,有一个服务正在往日志文件中写日志,这个时候,不小心把正在写入的日志文件删除了
上面的场景中,日志文件虽然被删除了,但是文件仍然是打开着的,它仍然占用文件系统的空间,我们可以结合 grep 命令找出这种打开着,但是已经被删除的文件
[root@ecs-centos-7 ~]# lsof -u tt | grep deleted
vim 27813 tt 4u REG 253,1 12288 131167 /home/tt/.p.txt.swp(deleted)
上面例子中使用 lsof -u tt | grep deleted 命令查看用户 tt打开着的确被删除的文件
从结果可以看出,在往 p.txt写入内容的时候,文件被删除了
列出所有打开了的网络文件
[root@ecs-centos-7 ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 567 ntp 18u IPv4 12657 0t0 UDP localhost:ntp
ntpd 567 ntp 22u IPv6 16095 0t0 UDP ecs-centos-7.4-64bit-20200212:ntp
dhclient 651 root 6u IPv4 14594 0t0 UDP *:bootpc
master 960 root 13u IPv4 15791 0t0 TCP localhost:smtp (LISTEN)
master 960 root 14u IPv6 15792 0t0 TCP localhost:smtp (LISTEN)
mysqld 1053 mysql 13u IPv6 15147 0t0 TCP *:mysql (LISTEN)
sshd 1348 root 3u IPv4 16698 0t0 TCP *:ssh (LISTEN)
- 列出所有 IPV4/6 网络文件
列出所有已经打开了的 ipv4 网络文件
[root@ecs-centos-7 ~]# lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 567 ntp 16u IPv4 12651 0t0 UDP *:ntp
ntpd 567 ntp 18u IPv4 12657 0t0 UDP localhost:ntp
ntpd 567 ntp 21u IPv4 16094 0t0 UDP ecs-centos-7.4-64bit-20200212:ntp
dhclient 651 root 6u IPv4 14594 0t0 UDP *:bootpc
master 960 root 13u IPv4 15791 0t0 TCP localhost:smtp (LISTEN)
sshd 1348 root 3u IPv4 16698 0t0 TCP *:ssh (LISTEN)
所有已经打开了的 ipv6 网络文件
[root@ecs-centos-7 ~]# lsof -i 6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 567 ntp 17u IPv6 12652 0t0 UDP *:ntp
ntpd 567 ntp 19u IPv6 12658 0t0 UDP localhost:ntp
ntpd 567 ntp 22u IPv6 16095 0t0 UDP ecs-centos-7.4-64bit-20200212:ntp
master 960 root 14u IPv6 15792 0t0 TCP localhost:smtp (LISTEN)
mysqld 1053 mysql 13u IPv6 15147 0t0 TCP *:mysql (LISTEN)
sshd 1348 root 4u IPv6 16700 0t0 TCP *:ssh (LISTEN)
- 列出在指定端口上打开的文件
使用 lsof -i:端口号 可以获得所有在指定端口号上打开的文件
[root@ecs-centos-7 ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1348 root 3u IPv4 16698 0t0 TCP *:ssh (LISTEN)
sshd 1348 root 4u IPv6 16700 0t0 TCP *:ssh (LISTEN)
sshd 27741 root 3u IPv4 458958 0t0 TCP ecs-centos-7.4-64bit-20200212:ssh->113.118.121.220:42395 (ESTABLISHED)
sshd 27819 root 3u IPv4 459250 0t0 TCP ecs-centos-7.4-64bit-20200212:ssh->113.118.121.220:19807 (ESTABLISHED)
sshd 27895 root 3u IPv4 459828 0t0 TCP
上面例子列出了所有在22号端口上打开的文件
在服务器开发中,经常会部署一个网关或者代理程序,用来和客户端通讯,网关或者代理程序需要开放一个固定的端口供客户端连接用
如果客户端连接不上网关或者代理程序,我们可以用上述命令检查网关或代理程序的端口是否开启,来排除因为端口关闭了导致连接不上网关的情况
- 列出使用了指定协议(TCP/UDP) 的文件
使用 lsof -i TCP/UDP 列出使用了TCP 或 UDP 协议的文件
[root@cghost8 /home/cgyx]# lsof -i TCP | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1704 root 3u IPv4 13593 0t0 TCP *:ssh (LISTEN)
sshd 1704 root 4u IPv6 13595 0t0 TCP *:ssh (LISTEN)
redis-serer 1725 root 4u IPv4 19773 0t0 TCP localhost:6380 (LISTEN)
nc 2067 cgyx 4u IPv4 39167 0t0 TCP *:60600 (LISTEN)
mysqld 3020 mysql 4u IPv6 5514608 0t0 TCP 192.168.70.10:mysql->192.168.70.10:37084 (ESTABLISHED)
使用 lsof -i TCP:3306 列出使用了TCP 协议并且端口为3306的文件
[root@cghost8 /home/cgyx]# lsof -i TCP:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 3020 mysql 4u IPv6 5514608 0t0 TCP 192.168.70.10:mysql->192.168.70.10:37084 (ESTABLISHED)
使用 lsof -i TCP:1-1024 列出使用了TCP协议并且端口范围为 1 到 1024 的文件
[root@cghost8 /home/cgyx]# lsof -i TCP:1-1024
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1704 root 3u IPv4 13593 0t0 TCP *:ssh (LISTEN)
sshd 1704 root 4u IPv6 13595 0t0 TCP *:ssh (LISTEN)
cupsd 1709 root 12u IPv6 39148 0t0 TCP localhost:ipp (LISTEN)
cupsd 1709 root 13u IPv4 39149 0t0 TCP localhost:ipp (LISTEN)
smbd 1824 root 35u IPv6 17658 0t0 TCP *:microsoft-ds (LISTEN)
smbd 1824 root 36u IPv6 17659 0t0 TCP *:netbios-ssn (LISTEN)
smbd 1824 root 37u IPv4 17660 0t0 TCP *:microsoft-ds (LISTEN)
smbd 1824 root 38u IPv4 17661 0t0 TCP *:netbios-ssn (LISTEN)
列出目录中所有打开的文件
可以使用lsof命令列出指定目录中的所有打开文件
现有一个data目录 ,结构如下:
[root@ecs-centos-7 tt]# tree data/
data/
├── dira
│ └── a.txt
└── d.s
1 directory, 2 files
列出 data 目录中打开的文件
[root@ecs-centos-7 tt]# lsof +D ./data/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 28473 root cwd DIR 253,1 4096 131146 ./data
bash 28502 root cwd DIR 253,1 4096 131172 ./data/dira
vim 28530 root cwd DIR 253,1 4096 131172 ./data/dira
vim 28530 root 4u REG 253,1 12288 131174 ./data/dira/.a.txt.swp
[root@ecs-centos-7 tt]# lsof +d ./data/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 28473 root cwd DIR 253,1 4096 131146 ./data
bash 28502 root cwd DIR 253,1 4096 131172 ./data/dira
vim 28530 root cwd DIR 253,1 4096 131172 ./data/dira
上面例子中,+D 和 +d 选项都是列出目录中打开的文件
+D 选项会列出一个目录和其子目录中打开的文件,而 +d 选项只会列出当前目录下已打开的文件
列出指定进程ID打开的文件
进程ID是操作系统进程的唯一标识,以下命令列出了进程ID为 1053 相关的文件, 从结果中可以知道这个进程ID对应的进程是MySQL
[root@ecs-centos-7 ~]# lsof -p 1053
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1053 mysql cwd DIR 253,1 4096 1055765 /var/lib/mysql
mysqld 1053 mysql rtd DIR 253,1 4096 2 /
mysqld 1053 mysql txt REG 253,1 251841448 534935 /usr/sbin/mysqld
mysqld 1053 mysql mem REG 253,1 209512 659436 /usr/lib64/mysql/plugin/validate_password.so
mysqld 1053 mysql 1w REG 253,1 206658 924771 /var/log/mysqld.log
mysqld 1053 mysql 2w REG 253,1 206658 924771 /var/log/mysqld.log
上述命令中,-p 选项后面可以指定多个进程ID,每个进程ID之间用逗号分隔,如果想排除掉某个进程打开的文件,可以在该进程ID前面加上 ^符号
lsof -p 1,2,3,^4
上述命令会列出进程1,进程2,进程3打开的所有文件,同时忽略进程4打开的文件
杀死指定用户的所有进程
前面介绍了列出指定用户所有打开的文件,我们可以组合 kill 命令一起使用,实现杀死指定用户的所有进程的功能,具体的命令如下
kill -9 `lsof -t -u tt`
上述命令中,lsof -u tt 是列出tt用户所有打开的文件,加上 -t 选项之后表示结果只列出PID列,也就是进程ID列,其他列都忽略,前面的 kill -9 表示强制结束指定的进程ID
小结
本文介绍了 lsof 命令的一些常见用法,它还有很多其他的用法,请自行查看man文档
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)