前言
最近又忙成狗,顾不上整理博客了。今晚又要上线,趁着这个时间,赶紧写点东西,把这篇文章总结一下吧。说到lsof命令,我第一次见它还是在2015年的3月份,那个时候刚刚入职亚信,给我分配了一个活,就是每天运行一个指定的脚本,统计某个进程打开oracle的连接数,后来看了下脚本,发现里面就是一个简单的lsof命令,那个时候也没有去深究这个lsof到底怎么用,反而到了今天,还要专门写一篇文章来还当初欠下的技术债,哎~~~,废话不多少,下面就开始lsof命令的总结。
命令简介
我们都知道在Linux环境中,文件无处不在,这便产生了一句格言:“任何事物都是文件”。通过文件不仅仅可以访问常规数据,通常还可以访问网络连接和硬件。在有些情况下,当使用ls请求目录清单时,将出现相应的条目。在其他情况下,如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字,不存在相应的目录清单。但是在后台为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,所以能够查看这个列表将是很有帮助的。lsof作为Linux下的一个非常实用的系统级的监控、诊断工具,可以很完美的完成这项任务。由于lsof需要访问核心内存和各种文件,所以最好使用root用户运行lsof命令。
命令安装
这是一个很尴尬的事情,这么好用的工具,在很多Linux发行版上居然不是自带的,在CentOS/Fedora/RHEL版本的Linux中则使用下面的命令进行安装。
yum install lsof
命令详解
lsof也是有着最多选项的Linux/Unix命令之一。lsof可以查看打开的文件是:
普通文件
目录
网络文件系统的文件
字符或设备文件
(函数)共享库
管道、命名管道
符号链接
网络文件(例如:NFS file、网络socket,unix域名socket)
还有其它类型的文件,等等
虽然lsof命令有着N多的选项,但是常用的只有以下几个:
-a:使用AND逻辑,合并选项输出内容
-c:列出名称以指定名称开头的进程打开的文件
-d:列出打开指定文件描述的进程
+d:列出目录下被打开的文件
+D:递归列出目录下被打开的文件
-n:列出使用NFS的文件
-u:列出指定用户打开的文件
-p:列出指定进程号所打开的文件
-i:列出打开的套接字
使用实例
总的说来,lsof命令还是一个比较复杂的命令,那么多选项,用起来还是蛮累的,但是这不能否定它是一个出色的工具,一个我们不得不学习的命令。下面就来说一些lsof的惯用用法。
命令:lsof
输出:
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 1523568 1053845 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,1 20040 1050452 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,1 261336 1051899 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,1 90664 1050435 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,1 157424 1050447 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,1 23968 1050682 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,1 19888 1050666 /usr/lib64/libattr.so.1.1.0
输出内容详解:
COMMAND:进程的名称
PID:进程标识符
TID:线程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件,一般有以下取值:
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库
lnn:library references (AIX)
er:FD information error (see NAME column)
jld:jail directory (FreeBSD)
ltx:shared library text (code and data)
mxx:hex memory-mapped type number xx
m86:DOS Merge mapped file
mem:memory-mapped file
mmap:memory-mapped device
pd:parent directory
rtd:root directory
tr:kernel trace file (OpenBSD)
v86:VP/ix mapped file
0:表示标准输出
1:表示标准输入
2:表示标准错误
TYPE:文件类型,常见的文件类型有以下几种:
DIR:表示目录
CHR:表示字符类型
BLK:块设备类型
UNIX:UNIX域套接字
FIFO:先进先出(FIFO)队列
IPv4:网际协议(IP)套接字
DEVICE:指定磁盘的名称
SIZE/OFF:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
命令:lsof abc.txt
说明:显示开启文件abc.txt的进程
命令:lsof -i :80
说明:列出80端口目前打开的文件列表
输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 8838 root 8u IPv4 114512623 0t0 TCP *:http (LISTEN)
nginx 12886 jelly 8u IPv4 114512623 0t0 TCP *:http (LISTEN)
nginx 12887 jelly 8u IPv4 114512623 0t0 TCP *:http (LISTEN)
命令:lsof -i
说明:列出所有的网络连接
输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 856 ntp 16u IPv4 13105 0t0 UDP *:ntp
ntpd 856 ntp 17u IPv6 13106 0t0 UDP *:ntp
ntpd 856 ntp 18u IPv4 13210 0t0 UDP localhost:ntp
ntpd 856 ntp 19u IPv4 13211 0t0 UDP jellythink:ntp
vsftpd 1613 root 3u IPv6 17867 0t0 TCP *:ftp (LISTEN)
php-fpm 4037 jelly 0u IPv4 60908335 0t0 TCP localhost:cslistener (LISTEN)
sshd 8503 root 3u IPv4 197060 0t0 TCP *:50022 (LISTEN)
nginx 8838 root 8u IPv4 114512623 0t0 TCP *:http (LISTEN)
nginx 8838 root 9u IPv4 114512624 0t0 TCP *:https (LISTEN)
php-fpm 9059 jelly 0u IPv4 60908335 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 9137 jelly 0u IPv4 60908335 0t0 TCP localhost:cslistener (LISTEN)
命令:lsof -i tcp
说明:列出所有的TCP网络连接信息
命令:lsof -i udp
说明:列出所有的UDP网络连接信息
命令:lsof -i tcp:80
说明:列出80端口TCP协议的所有连接信息
命令:lsof -i udp:25
说明:列出25端口UDP协议的所有连接信息
命令:lsof -c ngin
说明:列出以ngin开头的进程打开的文件列表
命令:lsof -p 20711
说明:列出指定进程打开的文件列表
命令:lsof -u uasp
说明:列出指定用户打开的文件列表
命令:lsof -u uasp -i tcp
说明:将所有的TCP网络连接信息和指定用户打开的文件列表信息一起输出
命令:lsof -a -u uasp -i tcp
说明:将指定用户打开的文件列表信息,同时是TCP网络连接信息的一起输出;注意和上一条命令进行对比
命令:lsof +d /usr/local/
说明:列出目录下被进程打开的文件列表
命令:lsof +D /usr/local/
说明:递归搜索目录下被进程打开的文件列表
命令:lsof -i @peida.linux:20,21,22,25,53,80 -r 3
说明:列出目前连接到主机peida.linux上端口为20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令
总结
这快过年了,年底总是少不了一堆的聚餐,这篇文章也写了好久,从12号写到20号,好歹趁着这个周末,把它搞定了。说实话,这个命令我在平时工作中用的还真的比较少,我想,通过这篇总结,以后还真的离不开它了,我的工具箱中也多了一件宝贝,希望我总结的lsof命令对你有帮助,希望你喜欢。
果冻想,认真玩技术的地方。
2019年1月20日,于内蒙古呼和浩特。