A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
lsof -p pid
。Unix 认为一切皆文件, 那么”打开的文件”就不仅仅是传统意义上打开的文件了,还可以是网络 / Unix 域套接字,匿名/具名管道, 共享库文件, 目录文件, 设备文件等等。 很多场景下,查看进程或系统打开的文件会给调试带来极大的帮助。 下面简单地介绍 lsof 常被使用的功能选项。
-bash: lsof: command not found #Debian apt-get install lsof #Ubuntu apt-get install lsof #Alpine apk add lsof #Arch Linux pacman -S lsof #Kali Linux apt-get install lsof #CentOS yum install lsof #Fedora dnf install lsof #OS X brew install lsof #Raspbian apt-get install lsof #Docker docker run cmd.cat/lsof lsof
lsof (list open files)命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行。
在 Linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP)
和用户数据报协议 (UDP)
套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof (选项)
-a:列出打开文件存在的进程; -c<进程名>: 列出指定进程所打开的文件; -g: 列出GID号进程详情; -d<文件号>: 列出占用该文件号的进程; +d<目录>: 列出目录下被打开的文件; +D<目录>: 递归列出目录下被打开的文件; -n<目录>: 列出使用NFS的文件; -l: 在输出显示用户ID而不是用户名 -i<条件>: 列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号>: 列出指定进程号所打开的文件; -u: 列出UID号进程详情; -h: 显示帮助信息; -t: 仅获取进程ID; -U: 获取UNIX套接口地址; -F: 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止) -v: 显示版本信息。
lsof 使用 -i 显示所有连接:
lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ntpd 502 ntp 16u IPv4 14021 0t0 UDP *:ntp ntpd 502 ntp 17u IPv6 14022 0t0 UDP *:ntp ntpd 502 ntp 18u IPv4 11251 0t0 UDP localhost:ntp ntpd 502 ntp 19u IPv6 11252 0t0 UDP localhost:ntp ntpd 502 ntp 21u IPv4 15821 0t0 UDP TestMaster:ntp ntpd 502 ntp 22u IPv6 15822 0t0 UDP TestMaster:ntp dhclient 698 root 6u IPv4 15808 0t0 UDP *:bootpc
lsof 使用 -i 6 仅获取 IPv6 流量:
lsof -i 6
lsof 仅显示 TCP 连接(同理可获得 UDP 连接):
lsof -iTCP
使用 -i:port
来显示与指定端口相关的网络信息:
lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1324 mysql 19u IPv6 18088 0t0 TCP *:mysql (LISTEN) ...
lsof 其他奇淫巧技:
# lsof 使用 @host 来显示指定到指定主机的连接 lsof -i@172.16.12.5 # lsof 使用 @host:port 显示基于主机与端口的连接 lsof -i@172.16.12.5:22 # lsof 找出正等候连接的端口,你也可以 grep “LISTEN” 来完成该任务。 lsof -i -sTCP:LISTEN lsof -i | grep -i LISTEN # lsof 找出已建立的连接, 也可以通过 grep 搜索 “ESTABLISHED” 来完成该任务 lsof -i -sTCP:ESTABLISHED
lsof 使用 -u 显示指定用户打开了什么:
lsof -u root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,1 4096 64 / systemd 1 root rtd DIR 253,1 4096 64 / systemd 1 root txt REG 253,1 1612152 1521 /usr/lib/systemd/systemd systemd 1 root mem REG 253,1 20112 6326639 /usr/lib64/libuuid.so.1.3.0 systemd 1 root mem REG 253,1 261456 6326650 /usr/lib64/libblkid.so.1.1.0 systemd 1 root mem REG 253,1 90248 6326913 /usr/lib64/libz.so.1.2.7 systemd 1 root mem REG 253,1 157424 6326920 /usr/lib64/liblzma.so.5.2.2 systemd 1 root mem REG 253,1 23968 6333378 /usr/lib64/libcap-ng.so.0.0.0 systemd 1 root mem REG 253,1 19896 6333372 /usr/lib64/libattr.so.1.1.0 systemd 1 root mem REG 253,1 19288 6293392 /usr/lib64/libdl-2.17.so systemd 1 root mem REG 253,1 402384 6322358 /usr/lib64/libpcre.so.1.2.0 systemd 1 root mem REG 253,1 2151672 6293390 /usr/lib64/libc-2.17.so systemd 1 root mem REG 253,1 141968 6747254 /usr/lib64/libpthread-2.17.so systemd 1 root mem REG 253,1 88776 6367865 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 systemd 1 root mem REG 253,1 43776 6747346 /usr/lib64/librt-2.17.so systemd 1 root mem REG 253,1 273616 6326930 /usr/lib64/libmount.so.1.1.0 systemd 1 root mem REG 253,1 91800 6333720 /usr/lib64/libkmod.so.2.2.10 systemd 1 root mem REG 253,1 127096 6326632 /usr/lib64/libaudit.so.1.0.0 ... # 列出除了 root 以外用户打开的文件 lsof -u ^root # kill + lsof 杀死指定用户所做的一切事情 kill -9 `lsof -t -u commandnotfound`
lsof 显示 commandnotfound 连接到 1.1.1.1 所做的一切
lsof -u commandnotfound -i @1.1.1.1