简介:
lsof(list open files)可以列出当前系统中进程打开的所有文件,在Linux环境下,我们可以理解为一切(包括网络套接口)皆文件。在实际使用过程中,lsof是一款非常强大的系统监控和系统诊断工具。在终端下输入lsof 即可显示系统打开的文件, lsof 一般需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
** 01**
lsof使用
Centos安装
yum -y install lsof命令安装lsof工具
使用方法
lsof --h显示使用方法
usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
终端下输入lsof命令,可以显示系统打开的文件
[root@localhost dockerbuild]# lsof |head
lsof输出每列含义如下
COMMAND:进程的名称
PID:进程标识符
TID:任务 ID。Linux 下 TID 为空表示该行为进程
USER:进程所有者
FD:文件描述符。主要有:
cwd:应用程序当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:库引用(AIX)
err:FD 信息错误
jld:监狱目录(FreeBSD)
ltx:共享库文本(代码和数据)
mxx:十六进制内存映射类型号 xx
m86:DOS合并映射文件
mem:内存映射文件
mmap:内存映射设备
pd:父目录
rtd:根目录
tr:内核跟踪文件(OpenBSD)
v86:VP/ix 映射文件
0:标准输出
1:标准输入
2:标准错误
文件描述符后一般还跟着文件状态模式:
r:只读模式
w:写入模式
u:读写模式
空格:文件的状态模式为 unknow,且没有锁定
-:文件的状态模式为 unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁:
N:对于未知类型的 Solaris NFS 锁
r:文件部分的读锁
R:整个文件的读锁
w:文件的部分写锁
W:整个文件的写锁
u:任何长度的读写锁
U:用于未知类型的锁
x:用于部分文件上的 SCO OpenServer Xenix 锁
X:用于整个文件上的 SCO OpenServer Xenix 锁
space:无锁
TYPE:文件类型。常见的文件类型有:
REG:普通文件
DIR:表示目录
CHR:表示字符类型
BLK:块设备类型
UNIX:UNIX 域套接字
FIFO:先进先出队列
IPv4:IPv4 套接字
DEVICE:磁盘名称
SIZE:文件的大小或文件偏移量(以字节为单位)
NODE:索引节点
NAME:打开文件的确切名称</pre>
下面我们举例在Linux上常用的几种用法
lsof -i 显示所有网络连接
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
显示指定端口占用进程
[root@localhost ~]# lsof -i:22
lsof /data ,这在 umount 某个文件系统失败时非常有用(通常会报该 FS is busy)
02
LSOF实战训练营
1、Lsof诊断Device is busy问题
在系统运维过程中,我们会遇到磁盘卸载报umount: /home: device is busy之类的提示,如下我们给/home单独挂载了磁盘/dev/sdb1
Filesystem Size Used Avail Use% Mounted on
卸载磁盘的时候提示如下
[root@localhost ~]# umount /home/
umount: /home: device is busy.
我们可以使用lsof命令找出占用磁盘的进程
[root@localhost ~]# lsof /home
直接kill掉此进程,磁盘成功卸载
[root@localhost ~]# kill -9 5689
当然除了kill进程外也可以使用如下方法:
umount -l /home 强行解除挂载
fuser -mv -k /homeh直接杀死占用磁盘的进程
2 、Lsof解决文件已删除空间未释放问题
磁盘空间达到100%会导致数据无法正常写入文件造成程序异常,如下/home空间达到100%,一般的解决方法是先删除大文件,然后有必要的情况下对磁盘进行扩容。
按照排查步骤,先进入/home目录查找占用磁盘的大文件(命令du -h --max-depth=1 /home),如下发现/home目录下并没有占用空间大的文件和目录。
那么为什么磁盘空间显示占用100%呢?原因是磁盘上文件已经被删除,但是存在进程仍然占用这些文件,因此其原来占用的磁盘空间并没有被释放,当然重启操作系统,空间会被释放出来,但是重启并不是最好的解决方法。
lsof -n | grep delete检查出占用文件的进程
[root@192 home]# lsof -n | grep delete
从进程显示上可以看出,/home目录下占用文件已经删除,仍然有3个进程在占用,我们采用kill方式杀死进程,释放空间。
[root@192 home]# kill -9 8400 8406 8415
3、巧用losf恢复已删除文件
利用lsof可以恢复一些系统日志,前提是这个进程必须存在,具体请参考下面实验步骤
[root@192 ~]# echo "Lsof test" >lsof.log
按照上面所示,我们创建文件lsof.log,然后使用tail命令产生一个后台进程
[root@192 ~]# ls
我们删除lsof.log文件,然后losf | grep lsof.log
[root@192 ~]# lsof |grep lsof.log
从进程占用上可以看出
PID:9933 FD:3 那我们有直接进入/proc/9933/FD/3查看一下
已经将文件重定向恢复到原路径
[root@192 fd]# cat /root/lsof.log
数据恢复完成,注意这个是有前提条件哦,占用进程需要存在。