文章目录
1、前言
在服务器领域Linux占有绝对地位,我们日常大量需要与它打交到。上线部署的应用与相关软件安装后运行状况我们需要了解,这时我们就需要用到监控、诊断工具了,这可是各位运维大神们的拿手菜,so easy!
今天的主角 是系统级的监控、诊断工具---- lsof
本文主要介绍了Linux lsof命令使用详解,文中会通过非常详细的示例代码介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随我来一起学习吧!
2、lsof介绍
lsof ( List Open Files) ,是 linux 下的一个极其实用的系统级监控、诊断工具。
List Open Files,让我们很容易就记住了它是 "ls + of"的组合,它可以用来列出被各种进程打开的文件信息。
记住:在linux环境下 “一切皆文件”,任何事物都以文件的形式存在,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件;
如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于此应用程序的信息。
因此,使用 lsof,你可以获取任何被打开文件的各种信息,只需输入 lsof 就可以生成大量的信息。
2.1、问题来了: 所有用户都可以采用该命令吗?
因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
3、 服务器安装lsof
3.1、安装
在 linux服务器上我们使用 yum -y install lsof命令来安装lsof工具
lsof -h查看命令帮助。
你也可以直接下载源代码:~abe/。
BSD系统有一个类似的工具可以做同样的事情,叫做fstat。
你可以通过man lsof来了解关于lsof的完整文档,或者通过lsof -h查看。
3.2、检查安装是否正常。
lsof -i 显示端口占用的进程
lsof -i: 8801 如图可以看到端口启动的服务是nginx。
4、lsof 命令
4.1、常用功能选项
lsof, LiSt Opened Files, 列出打开的文件, 听起来很简单的样子. 因Linux认为”一切皆文件”, 那么”打开的文件”就不仅仅是传统意义上打开的文件了, 还可以是网络/Unix域套接字, 匿名/具名管道, 共享库文件, 目录文件, 设备文件等等. 很多场景下, 查看进程或系统打开的文件会给调试带来极大的帮助。
下面我们简单地介绍lsof常被使用的功能选项:
-a 指示其它选项之间为与的关系
-c <进程名> 输出指定进程所打开的文件
-d <文件描述符> 列出占用该文件号的进程
+d <目录> 输出目录及目录下被打开的文件和目录(不递归)
+D <目录> 递归输出及目录下被打开的文件和目录
-i <条件> 输出符合条件与网络相关的文件
-n 不解析主机名
-p <进程号> 输出指定 PID 的进程所打开的文件
-P 不解析端口号
-t 只输出 PID
-u 输出指定用户打开的文件
-U 输出打开的 UNIX domain socket 文件
-h 显示帮助信息
-v 显示版本信息
4.2、输出内容
如果我们不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。
我们先让 lsof 命令输出当前 Bash 进程打开的文件,并截取其中的一部分结果来介绍输出内容中都包含哪些信息:
COMMAND:程序的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件
TYPE:文件类型,如 DIR、REG 等
DEVICE:以逗号分隔设备编号
SIZE:文件的大小(bytes)
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
使用时 我们可以
4.2.1 、FD和 TYPE列
很多人可能比较陌生FD和 TYPE列表示什么,下面我们来介绍一下。
1. FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。
cwd 表示当前的工作目录;
rtd 表示根目录;
txt 表示程序的可执行文件;
mem 表示内存映射文件。
还有一部分 FD 是以数字表示的,比如标准输入输出文件:
数字后面的字母表示进程对该文件的读写模式,如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,
我们还可以同时应用 W 表示该进程拥有对文件写操作的锁。
如下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:
2. TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。
CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6 分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。
5、 lsof 命令实操常见用法
lsof : 简单地执行lsof会列出当前系统中所有被打开的文件, 但为了看到完整的信息, 通常需要具有root权限;
1. 显示与指定目录交互的所有一切
lsof /var/log/messages/
2. 用户信息
你也可以获取各种用户的信息,以及它们在系统上正干着的事情,包括它们的网络活动、对文件的操作等。
使用-u显示指定用户打开了什么
lsof -u fyydlz : 列出用户fyydlz打开的文件, 可指定多个用户, 默认是OR的关系;
3. 使用-c查看指定的命令正在使用的文件和网络连接
lsof-c syslog-ng
lsof-c indp : 列出名称以indp开头的进程打开的文件, c for command, 可指定多个;lsof-c /^t.*r$/ : 列出名称以t开头, r结尾的进程打开的文件;
4. 使用-p查看指定进程ID已打开的内容
查看指定进程号打开的文件,对于查看日志很有帮助。
lsof -p 8081 : 列出进程号为8081的进程打开的文件, 可指定多个;
其它类似常见命令如下:
lsof server.log : 列出打开server.log文件的进程, 可指明多个文件;lsof.: 列出打开当前目录的进程;lsof +D .: 递归地列出当前目录中被打开的文件, 当然也可以lsof |greppwd;lsof-i: 列出打开的套接字;lsof-i tcp : 列出打开的tcp套接字;lsof-i :5198 : 列出打开5198端口的进程;lsof-i :ssh : 列出打开22端口的进程;lsof-i tcp:5198 : 列出打开5198号tcp端口的进程;lsof-U: 列出打开Unix域套接字的进程;lsof-d0-2 : 列出在0到2文件描述符上打开文件的进程;lsof-d mem : 列出打开映射文件的进程;lsof-d txt : 列出打开的可执行文件.
还有其他一些非常有用的选项, 可以对lsof的行为进行控制.
lsof -a: 上述功能性选项可以组合使用, 但默认采用OR逻辑列出, -a选项令lsof使用AND逻辑;
6 、常用组合命令
1. 列出进程号,杀死指定用户所做的一切事情
可以消灭指定用户运行的所有东西,这真不错。
lsof -t: 只列出进程号, 可以借此得到特定的进程列表, 以方便对这些进程的自动处理, 比如kill lsof -t -i :5198会杀死所有打开5198端口的进程;
lsof -r [seconds]: -r选项可以让lsof以一定的时间间隔连续执行, 在监视文件/进程时会非常实用.
2. 查看有哪些进程占用指定目录
lsof | grep /usr/local
磁盘空间达到100% 现象
lsof | grep delete 有时候会发现linux上磁盘空间达到100%,但是占用的文件没有这么大,就会出现此种进程,原因为文件实际上已经删除,
但是进程没有释放,可以使用kill -9 pid杀死进程的方式进行释放。
7、 结语
在linux环境下 “一切皆文件”,作为系统管理员,lsof 允许用户对核心内存进行查看,以找出系统当前如何使用这些文件。
lsof的简单用法可以告诉用户哪些进程打开了哪些文件,以及哪些文件由哪些进程打开。
在收集关于应用程序工作情况的信息或在进行某些可能损坏数据的操作前,要确保文件未被使用,这一点尤其重要。
lsof 更高级的用法可以帮助用户查找删除的文件,并获得关于网络连接的信息。lsof 是一个功能强大的工具,它几乎可以用于任何地方哦。
版权归原作者 风一样的美狼子 所有, 如有侵权,请联系我们删除。