linux每日命令(39):lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (tcp) 和用户数据报协议 (udp) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
一.命令格式:
lsof [参数] [文件]
二.命令功能:
用于查看你进程开打的文件,打开文件的进程,进程打开的端口(tcp、udp)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。
lsof打开的文件可以是:
1.普通文件
2.目录
3.网络文件系统的文件
4.字符或设备文件
5.(函数)共享库
6.管道,命名管道
7.符号链接
8.网络文件(例如:nfs file、网络socket,unix域名socket)
9.还有其它类型的文件,等等
三.命令参数:
参数 | 描述 |
---|---|
-a | 列出打开文件存在的进程 |
-c进程名> | 列出指定进程所打开的文件 |
-g | 列出gid号进程详情 |
-d文件号> | 列出占用该文件号的进程 |
+d目录> | 列出目录下被打开的文件 |
+d目录> | 递归列出目录下被打开的文件 |
-n目录> | 列出使用nfs的文件 |
-i条件> | 列出符合条件的进程。(4、6、协议、:端口、 @ip ) |
-p进程号> | 列出指定进程号所打开的文件 |
-u | 列出uid号进程详情 |
-h | 显示帮助信息 |
-v | 显示版本信息 |
四. 使用实例
1. 无任何参数
命令:
lsof
输出:
command pid tid user fd type device size/off node name systemd 1 root cwd dir 253,0 237 64 / systemd 1 root rtd dir 253,0 237 64 / systemd 1 root txt reg 253,0 1612152 911487 /usr/lib/systemd/systemd systemd 1 root mem reg 253,0 20112 34396 /usr/lib64/libuuid.so.1.3.0 systemd 1 root mem reg 253,0 261456 34565 /usr/lib64/libblkid.so.1.1.0 systemd 1 root mem reg 253,0 90664 34146 /usr/lib64/libz.so.1.2.7 systemd 1 root mem reg 253,0 157424 34404 /usr/lib64/liblzma.so.5.2.2 systemd 1 root mem reg 253,0 23968 34497 /usr/lib64/libcap-ng.so.0.0.0 systemd 1 root mem reg 253,0 19896 34234 /usr/lib64/libattr.so.1.1.0 systemd 1 root mem reg 253,0 19776 34059 /usr/lib64/libdl-2.17.so systemd 1 root mem reg 253,0 402384 34196 /usr/lib64/libpcre.so.1.2.0 systemd 1 root mem reg 253,0 2173512 34053 /usr/lib64/libc-2.17.so systemd 1 root mem reg 253,0 144792 34079 /usr/lib64/libpthread-2.17.so systemd 1 root mem reg 253,0 88776 4394296 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 systemd 1 root mem reg 253,0 44448 34083 /usr/lib64/librt-2.17.so systemd 1 root mem reg 253,0 273616 38958 /usr/lib64/libmount.so.1.1.0 systemd 1 root mem reg 253,0 91800 39542 /usr/lib64/libkmod.so.2.2.10 systemd 1 root mem reg 253,0 127096 34501 /usr/lib64/libaudit.so.1.0.0 systemd 1 root mem reg 253,0 61672 68528 /usr/lib64/libpam.so.0.83.1 systemd 1 root mem reg 253,0 20032 34236 /usr/lib64/libcap.so.2.22 systemd 1 root mem reg 253,0 155784 34260 /usr/lib64/libselinux.so.1 systemd 1 root mem reg 253,0 164240 34046 /usr/lib64/ld-2.17.so systemd 1 root 0u chr 1,3 0t0 7241 /dev/null systemd 1 root 1u chr 1,3 0t0 7241 /dev/null systemd 1 root 2u chr 1,3 0t0 7241 /dev/null systemd 1 root 3u a_inode 0,10 0 7237 [timerfd] systemd 1 root 4u a_inode 0,10 0 7237 [eventpoll] systemd 1 root 5u a_inode 0,10 0 7237 [signalfd] systemd 1 root 6r dir 0,22 0 9299 /sys/fs/cgroup/systemd systemd 1 root 7u a_inode 0,10 0 7237 [timerfd] systemd 1 root 8u netlink 0t0 14145 kobject_uevent systemd 1 root 9r reg 0,3 0 7544 /proc/1/mountinfo systemd 1 root 10r a_inode 0,10 0 7237 inotify systemd 1 root 11r reg 0,3 0 4026532019 /proc/swaps
说明:
列名 | 含义 |
---|---|
command | 进程的名称 |
pid | 进程标识符 |
tid | 线程标识符 |
user | 进程所有者 |
fd | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 |
type | 文件类型,如dir、reg等 |
device | 指定磁盘的名称 |
size | 文件的大小 |
node | 索引节点(文件在磁盘上的标识) |
name | 打开文件的确切名称 |
文件描述符
(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
(3)lnn:library references (aix);
(4)er:fd information error (see name column);
(5)jld:jail directory (freebsd);
(6)ltx:shared library text (code and data);
(7)mxx :hex memory-mapped type number xx.
(8)m86:dos merge mapped file;
(9)mem:memory-mapped file;
(10)mmap:memory-mapped device;
(11)pd:parent directory;
(12)rtd:root directory;
(13)tr:kernel trace file (openbsd);
(14)v86 vp/ix mapped file;
(15)0:表示标准输出
(16)1:表示标准输入
(17)2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于只写模式
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁
(1)n:for a solaris nfs lock of unknown type;
(2)r:for read lock on part of the file;
(3)r:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分写锁)
(5)w:for a write lock on the entire file;(整个文件的写锁)
(6)u:for a read and write lock of any length;
(7)u:for a lock of unknown type;
(8)x:for an sco openserver xenix lock on part of the file;
(9)x:for an sco openserver xenix lock on the entire file;
(10)space:if there is no lock.
常见的文件类型
(1)dir:表示目录
(2)chr:表示字符类型
(3)blk:块设备类型
(4)unix: unix 域套接字
(5)fifo:先进先出 (fifo) 队列
(6)ipv4:网际协议 (ip) 套接字
2. 查看谁正在使用某个文件,也就是说查找某个文件相关的进程
命令:
lsof /bin/bash
输出:
[root@localhost tmp]# lsof /bin/bash lsof: warning: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs output information may be incomplete. command pid user fd type device size/off node name ksmtuned 760 root txt reg 253,0 964544 50334971 /usr/bin/bash mysqld_sa 1244 mysql txt reg 253,0 964544 50334971 /usr/bin/bash bash 31477 root txt reg 253,0 964544 50334971 /usr/bin/bash bash 62533 hc txt reg 253,0 964544 50334971 /usr/bin/bash
实例3:递归查看某个目录的文件信息
命令:
lsof /home/hc
输出:
[root@localhost hc]# lsof /home/hc lsof: warning: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs output information may be incomplete. command pid user fd type device size/off node name gnome-ses 2431 hc cwd dir 253,0 4096 3463271 /home/hc gnome-she 2700 hc cwd dir 253,0 4096 3463271 /home/hc ibus-daem 2731 hc cwd dir 253,0 4096 3463271 /home/hc ibus-dcon 2736 hc cwd dir 253,0 4096 3463271 /home/hc ibus-x11 2740 hc cwd dir 253,0 4096 3463271 /home/hc gsd-mouse 2864 hc cwd dir 253,0 4096 3463271 /home/hc gsd-power 2866 hc cwd dir 253,0 4096 3463271 /home/hc gsd-print 2871 hc cwd dir 253,0 4096 3463271 /home/hc gsd-rfkil 2874 hc cwd dir 253,0 4096 3463271 /home/hc gsd-scree 2875 hc cwd dir 253,0 4096 3463271 /home/hc gsd-smart 2880 hc cwd dir 253,0 4096 3463271 /home/hc gsd-wacom 2881 hc cwd dir 253,0 4096 3463271 /home/hc gsd-xsett 2888 hc cwd dir 253,0 4096 3463271 /home/hc gsd-sound 2894 hc cwd dir 253,0 4096 3463271 /home/hc gsd-shari 2896 hc cwd dir 253,0 4096 3463271 /home/hc gsd-a11y- 2912 hc cwd dir 253,0 4096 3463271 /home/hc gsd-a11y- 2913 hc cwd dir 253,0 4096 3463271 /home/hc gsd-clipb 2914 hc cwd dir 253,0 4096 3463271 /home/hc gsd-color 2916 hc cwd dir 253,0 4096 3463271 /home/hc gsd-datet 2921 hc cwd dir 253,0 4096 3463271 /home/hc gsd-house 2922 hc cwd dir 253,0 4096 3463271 /home/hc gsd-keybo 2924 hc cwd dir 253,0 4096 3463271 /home/hc gsd-media 2927 hc cwd dir 253,0 4096 3463271 /home/hc gsd-accou 2936 hc cwd dir 253,0 4096 3463271 /home/hc gsd-print 2963 hc cwd dir 253,0 4096 3463271 /home/hc nautilus- 2974 hc cwd dir 253,0 4096 3463271 /home/hc gnome-sof 3005 hc cwd dir 253,0 4096 3463271 /home/hc tracker-m 3008 hc cwd dir 253,0 4096 3463271 /home/hc abrt-appl 3015 hc cwd dir 253,0 4096 3463271 /home/hc evolution 3018 hc cwd dir 253,0 4096 3463271 /home/hc vmtoolsd 3030 hc cwd dir 253,0 4096 3463271 /home/hc tracker-e 3038 hc cwd dir 253,0 4096 3463271 /home/hc tracker-m 3041 hc cwd dir 253,0 4096 3463271 /home/hc tracker-m 3049 hc cwd dir 253,0 4096 3463271 /home/hc ibus-engi 3089 hc cwd dir 253,0 4096 3463271 /home/hc gnome-ter 3778 hc cwd dir 253,0 4096 3463271 /home/hc bash 3785 hc cwd dir 253,0 4096 3463271 /home/hc bash 3964 root cwd dir 253,0 4096 3463271 /home/hc lsof 4208 root cwd dir 253,0 4096 3463271 /home/hc lsof 4209 root cwd dir 253,0 4096 3463271 /home/hc
说明:
如果使用了+d参数,则对应目录下的所有子目录和文件都会被列出
4. 不使用+d选项,遍历查看某个目录的所有文件信息的方法
命令:
lsof |grep /home/hc
5. 列出root用户打开的文件信息
命令:
lsof -u root
说明:
-u 选项,u其实是user的缩写
6. 列出某个程序进程所打开的文件信息
命令:
lsof -c mysql
说明:
-c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了
7. 列出多个进程多个打开的文件信息
命令:
lsof -c mysql -c uwsgi
8. 列出某个用户以及某个进程所打开的文件信息
命令:
lsof -u hc -c mysql
说明:
用户与进程可相关,也可以不相关
9. 列出除了某个用户外的被打开的文件信息
命令:
lsof -u ^root
说明:
^这个符号在用户名之前,将会把root用户打开的进程不显示
10. 通过某个进程号显示该进程打开的文件
命令:
lsof -p 1
说明:
查看pid为1的进程对应的文件的文件信息
11. 列出多个进程号对应的文件信息
命令:
lsof -p 1,2,3
说明:
查看pid为1,2,3的进程对应的文件信息
12. 列出除了某个进程号外的其他进程号所打开的文件信息
命令:
lsof -p ^1
13. 列出所有的网络连接
命令:
lsof -i
14. 列出所有tcp 网络连接信息
命令:
lsof -i tcp
15. 列出所有udp网络连接信息
命令:
lsof -i udp
16. 列出谁在使用某个端口
命令:
lsof -i :3306
17. 列出谁在使用某个特定的udp端口
命令:
lsof -i udp:55
18. 列出谁在使用某个特定的tcp端口
命令:
lsof -i tcp:80
19. 列出某个用户的所有活跃的网络端口
命令:
lsof -a -u root -i
20. 列出所有网络文件系统
命令:
lsof -n
21. 域名socket文件
命令:
lsof -u
22. 某个用户组所打开的文件信息
命令:
lsof -g 5555
23. 根据文件描述列出对应的文件信息
命令:
lsof -d description(like 2)
例如:lsof -d txt
例如:lsof -d 1
例如:lsof -d 2
说明:
0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 fd 都是从 3 开始
24. 根据文件描述范围列出文件信息
命令:
lsof -d 2-3
25. 列出command列中包含字符串" sshd",且文件描符的类型为txt的文件信息
命令:
lsof -c sshd -a -d txt
输出:
[root@localhost hc]# lsof -c sshd -a -d txt lsof: warning: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs output information may be incomplete. command pid user fd type device size/off node name sshd 1127 root txt reg 253,0 853040 3283742 /usr/sbin/sshd
26. 列出被进程号为1234的进程所打开的所有ipv4 network files
命令:
lsof -i 4 -a -p 1234
27. 列出目前连接主机上端口为:2280相关的所有文件信息,且每隔3秒不断的执行lsof指令
命令:
lsof -i :22,80 -r 3
输出:
[root@localhost hc]# lsof -i :22,80 -r 3 command pid user fd type device size/off node name sshd 1127 root 3u ipv4 25378 0t0 tcp *:ssh (listen) sshd 1127 root 4u ipv6 25387 0t0 tcp *:ssh (listen) nginx 1189 root 6u ipv4 27457 0t0 tcp *:http (listen) nginx 1190 root 6u ipv4 27457 0t0 tcp *:http (listen) ======= command pid user fd type device size/off node name sshd 1127 root 3u ipv4 25378 0t0 tcp *:ssh (listen) sshd 1127 root 4u ipv6 25387 0t0 tcp *:ssh (listen) nginx 1189 root 6u ipv4 27457 0t0 tcp *:http (listen) nginx 1190 root 6u ipv4 27457 0t0 tcp *:http (listen) ======= ^c [root@localhost hc]#