问题描述
有台虚拟机的磁盘最近经常zabbix报警说是空间不足,通过ssh终端连接但因为一点空间都没有了,所以google-otp连接时也报错了,只能用vnc去连接,清理了一些久远的日志后终于可以用ssh终端去连接了,继续将能清理的日志,压缩包等等都清掉了,但是磁盘空间用df -h
去查看时avail列仍然是0。
在linux系统中,如果使用rm
删除某个大文件,但在删除之前如果有进程已经打开该文件,却没有关闭这个句柄,那么linux内核还是不会释放该文件的磁盘空间,最后造成磁盘空间占用100%,因为没有磁盘提供读写,使系统无法正常运行。
解决思路
1.df和du两条命令返回的结果不一致
df -h
与 du -sh /*
去查看根目录下所有子目录加起来总数的值不一致,一般的情况都是df -h
显示磁盘使用100%,而du -sh *
显示根目录占用磁盘空间却很小。遇到这种情况基本断定,某些大文件被某些进程占用,导致内核不能释放空间,不能更新磁盘显示,但是磁盘目录又被占用,所以显示不一致。因为文件删除后,占用该文件的进程没有被关闭,造成内核无法回收这些文件占用的空间。
如何记忆这两个命令:
du -- Disk Usage
df -- Disk Free
du的工作原理:
du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
df的工作原理:
df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。
以下为五种问题的原因:
- 1.用户删除了大量的文件后,
du
命令就不会在文件系统目录中统计这些文件。如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df
命令仍会统计这个被删除的文件。 通过lsof
命令查询处于deleted
状态的文件,被删除的文件在系统中被标记为deleted
。如果系统有大量deleted
状态的文件,会导致du
和df
命令统计结果不一致。 可在目录下执行如下命令查看。
lsof |grep deleted
-
2.Linux系统磁盘分区有保留区的概念,会给root或指定用户预留5%或更大的空间,当使用到这块保留区的空间时,
fdisk
命令的计算将会是负数。ext文件系统(包括ext2、ext3、ext4
)都会默认预留5%的磁盘空间,使用root用户维护系统或记录系统关键日志使用。 -
3.当用
du -sh *
命令来统计目录总容量时,如果该路径下包含隐藏文件,是不会包含在统计结果里的。 -
4.由于删除了大量小文件,导致inode释放出现问题。
-
5.由于数据盘挂载前该路径下就存在文件,挂载后用
du
无法查询到原路径文件。
参考链接:
https://superuser.com/questions/94217/why-ls-and-du-show-different-size
2.找出大文件删除
使用下面命令可以查找根目录下各个子目录的大小:
du -lh / --max-depth=1
97M /boot
0 /dev
du: cannot access ‘/proc/57701’: No such file or directory
du: cannot access ‘/proc/57712/task/57712/fd/3’: No such file or directory
du: cannot access ‘/proc/57712/task/57712/fdinfo/3’: No such file or directory
du: cannot access ‘/proc/57712/fd/4’: No such file or directory
du: cannot access ‘/proc/57712/fdinfo/4’: No such file or directory
0 /proc
77M /run
0 /sys
36M /etc
11G /root
5.5G /var
3.1M /tmp
9.7G /usr
1.2G /home
0 /media
0 /mnt
98M /opt
0 /srv
639M /data
28K /itcast
28G /
或者用find命令,例如对30天前,超过50M的系统日志进行删除,可以这样写:
find /var/log/* -name "*log*" -mtime +30 -size +50M -exec rm -fr {} \;
具体应用日志的删除同理。
3.根目录下实际占用空间并没有满,有可能只是删除了文件,但实际进程还在文件还是打开的空间没有释放
列出当前系统已打开文件,但是deleted的状态
lsof -n|grep deleted
4.可以kill掉相应进程的pid,或重启相应的服务
如果tomcat的catalina.out文件被不规范的删除掉了,可以试试重启对应的tomcat实例。
lsof命令详解
lsof命令常用于查找进程打开了哪些文件以及与打开文件相关联的内容,下面将介绍lsof常用的命令参数
1.基本概念
lsof(list open files)命令可以列出当前系统已经打开的所有文件。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表,这对系统监测以及排错是很有帮助的。
2.lsof输出含义
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,2 4096 2 /
systemd 1 root rtd DIR 253,2 4096 2 /
systemd 1 root txt REG 253,2 1632744 6955213 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,2 20064 6958299 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,2 265576 6958301 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,2 90176 6950732 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,2 157424 6951082 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,2 23968 6951287 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,2 19896 6950707 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,2 19248 6957950 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,2 402384 6950722 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,2 2156352 6950563 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,2 142144 6950589 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,2 88720 6968919 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,2 43712 6958290 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,2 277808 6953826 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,2 91800 6954357 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,2 127184 6958946 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,2 61680 6952830 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,2 20048 6950710 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,2 155744 6950605 /usr/lib64/libselinux.so.1
systemd 1 root mem REG 253,2 163312 6968926 /usr/lib64/ld-2.17.so
systemd 1 root 0u CHR 1,3 0t0 1028 /dev/null
systemd 1 root 1u CHR 1,3 0t0 1028 /dev/null
systemd 1 root 2u CHR 1,3 0t0 1028 /dev/null
systemd 1 root 3r CHR 10,235 0t0 1132 /dev/autofs
systemd 1 root 4u a_inode 0,10 0 6415 [eventpoll]
systemd 1 root 5u a_inode 0,10 0 6415 [signalfd]
systemd 1 root 6r DIR 0,22 0 10252 /sys/fs/cgroup/systemd
systemd 1 root 7u a_inode 0,10 0 6415 [timerfd]
systemd 1 root 8u netlink 0t0 168379935 KOBJECT_UEVENT
systemd 1 root 9r REG 0,3 0 10472 /proc/1/mountinfo
systemd 1 root 10r a_inode 0,10 0 6415 inotify
systemd 1 root 11r REG 0,3 0 4026532019 /proc/swaps
systemd 1 root 12u unix 0xffff93914268e400 0t0 168379937 socket
systemd 1 root 13u a_inode 0,10 0 6415 [timerfd]
systemd 1 root 14u unix 0xffff93916be71000 0t0 168379158 /run/systemd/private
systemd 1 root 15u unix 0xffff939169237000 0t0 3890288228 socket
systemd 1 root 16r a_inode 0,10 0 6415 inotify
每行显示一个已经打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
-
1.COMMAND:命令的名称;
-
2.PID:进程id;
-
3.TID:线程id,如果为空代表列出的是进程;
-
4.TASKCMD:任务名称,通常与COMMAND相同;
-
5.USER:进程所有者,用户ID号或登录名;
-
6.FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
-
7.TYPE:文件类型,如DIR、REG等
-
8.DEVICE:设备号
-
9.SIZE/OFF:文件的大小/偏移量,以字节为单位;
-
10.NODE:索引节点(文件在磁盘上的标识);
-
11.NAME:文件挂载点和文件所在的系统;
-
FD列中的文件描述符cwd值表示应用程序的当前工作目录,默认是该应用程序启动的目录,除非它本身对这个目录进行更改。
-
FD是txt的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的
/sbin/init
程序。
其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/null
,其文件描述符为2u,u表示该文件被打开并处于读取/写入模式,而不是只读(r)或只写 (w) 模式。
同时还有大写的W表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
- 与 FD 列相比,Type 列则比较直观。文件和目录分别为REG和DIR。而CHR和BLK,分别表示字符和块设备,或者UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
3.常用参数
-p pid: 输出指定进程打开的文件;
-l: 输出中使用ID代替用户名;
-u userName: 输出指定用户打开的文件;
-c string: 输出 COMMAND 列中包含 string 的项;
-d fd: 输出包含指定描述符的项;
fileName: 输出打开文件 fileName 的所有项;
-i [46] [protocol][@hostname|hostaddr][:service|port]: 输出符合指定条件的项,其中:
46:分别指 IPv4、IPv6;
protocol:指 TCP 或 UDP;
hostname: 网络主机名;
hostaddr: IP 地址;
service: 包含在 /etc/services 中的名称;
port: 端口号,可以是多个;
4.实例
4.1 无参数
在终端中直接执行lsof
命令,如下所示:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,2 4096 2 /
systemd 1 root rtd DIR 253,2 4096 2 /
systemd 1 root txt REG 253,2 1632744 6955213 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,2 20064 6958299 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,2 265576 6958301 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,2 90176 6950732 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,2 157424 6951082 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,2 23968 6951287 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,2 19896 6950707 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,2 19248 6957950 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,2 402384 6950722 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,2 2156352 6950563 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,2 142144 6950589 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,2 88720 6968919 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,2 43712 6958290 /usr/lib64/librt-2.17.so
4.2 -p参数
执行命令lsof -p 1
,列出1号进程打开的文件,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,2 4096 2 /
systemd 1 root rtd DIR 253,2 4096 2 /
systemd 1 root txt REG 253,2 1632744 6955213 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,2 20064 6958299 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,2 265576 6958301 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,2 90176 6950732 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,2 157424 6951082 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,2 23968 6951287 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,2 19896 6950707 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,2 19248 6957950 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,2 402384 6950722 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,2 2156352 6950563 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,2 142144 6950589 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,2 88720 6968919 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,2 43712 6958290 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,2 277808 6953826 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,2 91800 6954357 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,2 127184 6958946 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,2 61680 6952830 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,2 20048 6950710 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,2 155744 6950605 /usr/lib64/libselinux.so.1
systemd 1 root mem REG 253,2 163312 6968926 /usr/lib64/ld-2.17.so
systemd 1 root 0u CHR 1,3 0t0 1028 /dev/null
systemd 1 root 1u CHR 1,3 0t0 1028 /dev/null
systemd 1 root 2u CHR 1,3 0t0 1028 /dev/null
4.3 -l参数
执行命令lsof -l
,输出中使用用户ID代替用户名,如下所示:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 0 cwd DIR 253,0 250 64 /
systemd 1 0 rtd DIR 253,0 250 64 /
systemd 1 0 txt REG 253,0 1612152 201812960 /usr/lib/systemd/systemd
systemd 1 0 mem REG 253,0 20064 36906 /usr/lib64/libuuid.so.1.3.0
systemd 1 0 mem REG 253,0 265576 1946616 /usr/lib64/libblkid.so.1.1.0
systemd 1 0 mem REG 253,0 90176 1946606 /usr/lib64/libz.so.1.2.7
systemd 1 0 mem REG 253,0 157424 88392 /usr/lib64/liblzma.so.5.2.2
systemd 1 0 mem REG 253,0 23968 88428 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 0 mem REG 253,0 19896 73620 /usr/lib64/libattr.so.1.1.0
例子中,USER列显示的是用户ID而不是用户名
4.4 -u参数
执行命令lsof -u elasticsearch
,输出elasticsearch用户打开的文件:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 61425 elasticsearch cwd DIR 253,0 168 67113067 /usr/local/elasticsearch
java 61425 elasticsearch rtd DIR 253,0 250 64 /
java 61425 elasticsearch txt REG 253,0 9024 201384215 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/bin/java
java 61425 elasticsearch mem REG 253,0 2474777 2631737 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_1z6_Lucene70_0.dvd
java 61425 elasticsearch mem REG 253,0 8782613 2631733 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_1z6.fdt
java 61425 elasticsearch mem REG 253,0 2782591 2631739 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_1z6.dim
java 61425 elasticsearch mem REG 253,0 2219170 2631709 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_xc_Lucene70_0.dvd
java 61425 elasticsearch mem REG 253,0 2458366 2631712 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_xc.dim
java 61425 elasticsearch mem REG 253,0 7855443 2631706 /usr/local/elasticsearch/data/nodes/0/indices/zrWs8KYJSza45auc3Rw2_w/0/index/_xc.fdt
4.5 -c参数
执行lsof -c sshd
,输出COMMAND列包括sshd的项,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1332 root cwd DIR 253,0 250 64 /
sshd 1332 root rtd DIR 253,0 250 64 /
sshd 1332 root txt REG 253,0 853040 416459 /usr/sbin/sshd
sshd 1332 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd 1332 root mem REG 253,0 68192 88405 /usr/lib64/libbz2.so.1.0.6
sshd 1332 root mem REG 253,0 99944 88410 /usr/lib64/libelf-0.170.so
sshd 1332 root mem REG 253,0 19896 73620 /usr/lib64/libattr.so.1.1.0
sshd 1332 root mem REG 253,0 15688 73670 /usr/lib64/libkeyutils.so.1.5
sshd 1332 root mem REG 253,0 67104 43373 /usr/lib64/libkrb5support.so.0.1
sshd 1332 root mem REG 253,0 11464 1231 /usr/lib64/libfreebl3.so
sshd 1332 root mem REG 253,0 251776 73571 /usr/lib64/libnspr4.so
sshd 1332 root mem REG 253,0 20040 73572 /usr/lib64/libplc4.so
sshd 1332 root mem REG 253,0 15744 43391 /usr/lib64/libplds4.so
sshd 1332 root mem REG 253,0 194944 73570 /usr/lib64/libnssutil3.so
sshd 1332 root mem REG 253,0 1249544 88656 /usr/lib64/libnss3.so
sshd 1332 root mem REG 253,0 164288 88657 /usr/lib64/libsmime3.so
sshd 1332 root mem REG 253,0 323664 88658 /usr/lib64/libssl3.so
sshd 1332 root mem REG 253,0 470328 36908 /usr/lib64/libssl.so.1.0.2k
sshd 1332 root mem REG 253,0 121320 88688 /usr/lib64/libsasl2.so.3.0.0
4.6 -d参数
执行命令lsof -d 12
,输出打开文件描述符12的所有项,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 12u unix 0xffff9c2bf5ca8400 0t0 12889 /run/systemd/private
systemd-j 473 root 12u a_inode 0,10 0 7239 [timerfd]
systemd-l 673 root 12u unix 0xffff9c2c75b47400 0t0 24214 socket
dbus-daem 674 dbus 12u unix 0xffff9c2c579f6400 0t0 28531 /run/dbus/system_bus_socket
superviso 791 root 12w FIFO 0,9 0t0 25312 pipe
java 867 apache 12r REG 253,0 139612 135477660 /usr/local/zookeeper/apache-zookeeper-3.5.10-bin/lib/netty-transport-classes-epoll-4.1.77.Final.jar
java 869 root 12r REG 253,0 8764 135489756 /usr/local/logstash/logstash-core/lib/jars/j2objc-annotations-1.1.jar
java 871 apache 12r REG 253,0 98658 2160256 /usr/local/kafka/kafka_2.12-2.8.0/libs/connect-api-2.8.0.jar
dockerd 1341 root 12u netlink 0t0 28366 XFRM
PM2 1482 root 12u a_inode 0,10 0 7239 [eventfd]
node 5126 root 12u IPv4 2799435 0t0 TCP elk1:39004->elk1:wap-wsp (ESTABLISHED)
java 61425 elasticsearch 12r REG 253,0 100019 134323185 /usr/local/elasticsearch/lib/lucene-backward-codecs-7.5.0.jar
sshd 86209 root 12u CHR 5,2 0t0 1115 /dev/ptmx
nginx 87830 nginx 12u a_inode 0,10 0 7239 [eventfd]
nginx 87831 nginx 12u a_inode 0,10 0 7239 [eventpoll]
node 100360 root 12w FIFO 0,9 0t0 5337034 pipe
sshd 113462 root 12u CHR 5,2 0t0 1115 /dev/ptmx
4.7 fileName
执行命令,查看打开文件
的进程项,如下所示:
lsof /usr/lib64/libnss_files-2.17.so
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-u 505 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
auditd 635 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
VGAuthSer 663 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
rpcbind 666 rpc mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
vmtoolsd 669 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
polkitd 670 polkitd mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
systemd-l 673 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
dbus-daem 674 dbus mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
chronyd 676 chrony mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
crond 696 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
agetty 707 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
superviso 791 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
java 867 apache mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
java 869 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
java 871 apache mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
tuned 1330 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd 1332 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
container 1339 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
dockerd 1341 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
node 5126 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
java 61425 elasticsearch mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
rsyslogd 62322 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd 86209 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
bash 86222 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
nginx 87829 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
nginx 87830 nginx mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
nginx 87831 nginx mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
sshd 113462 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
bash 113475 root mem REG 253,0 61560 1946576 /usr/lib64/libnss_files-2.17.so
4.8 -i参数
(1).执行命令lsof -i 4
,输出TYPE是IPv4的所有项,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 666 rpc 6u IPv4 23206 0t0 UDP *:sunrpc
rpcbind 666 rpc 7u IPv4 23208 0t0 UDP *:837
rpcbind 666 rpc 8u IPv4 23209 0t0 TCP *:sunrpc (LISTEN)
chronyd 676 chrony 5u IPv4 24242 0t0 UDP localhost:323
java 867 apache 42u IPv4 25599 0t0 TCP *:32975 (LISTEN)
java 867 apache 43u IPv4 29956 0t0 TCP *:webcache (LISTEN)
java 867 apache 52u IPv4 29666 0t0 TCP *:eforward (LISTEN)
java 867 apache 56u IPv4 30354 0t0 TCP elk1:eforward->elk1:55062 (ESTABLISHED)
java 869 root 55u IPv4 38991 0t0 TCP elk1:38794->elk1:wap-wsp (CLOSE_WAIT)
java 869 root 83u IPv4 38703 0t0 TCP elk1:38796->elk1:wap-wsp (CLOSE_WAIT)
java 869 root 84u IPv4 39027 0t0 TCP elk1:38798->elk1:wap-wsp (CLOSE_WAIT)
java 869 root 85u IPv4 39029 0t0 TCP elk1:sruth->elk1:wap-wsp (CLOSE_WAIT)
java 869 root 98u IPv4 39975 0t0 TCP *:lxi-evntsvc (LISTEN)
java 869 root 101u IPv4 39213 0t0 TCP localhost:micromuse-ncpw (LISTEN)
java 871 apache 110u IPv4 29992 0t0 TCP *:36256 (LISTEN)
java 871 apache 121u IPv4 30846 0t0 TCP elk1:55062->elk1:eforward (ESTABLISHED)
java 871 apache 177u IPv4 31320 0t0 TCP *:XmlIpcRegSvc (LISTEN)
sshd 1332 root 3u IPv4 28899 0t0 TCP *:ssh (LISTEN)
node 5126 root 10u IPv4 38130 0t0 TCP elk1:esmagent (LISTEN)
node 5126 root 11u IPv4 2799427 0t0 TCP elk1:39002->elk1:wap-wsp (ESTABLISHED)
node 5126 root 12u IPv4 2799435 0t0 TCP elk1:39004->elk1:wap-wsp (ESTABLISHED)
node 5126 root 13u IPv4 3001582 0t0 TCP elk1:39034->elk1:wap-wsp (ESTABLISHED)
node 5126 root 14u IPv4 2799462 0t0 TCP elk1:39008->elk1:wap-wsp (ESTABLISHED)
node 5126 root 15u IPv4 2799474 0t0 TCP elk1:39010->elk1:wap-wsp (ESTABLISHED)
node 5126 root 16u IPv4 2799475 0t0 TCP elk1:39012->elk1:wap-wsp (ESTABLISHED)
node 5126 root 17u IPv4 2799476 0t0 TCP elk1:39014->elk1:wap-wsp (ESTABLISHED)
node 5126 root 18u IPv4 2799477 0t0 TCP elk1:39016->elk1:wap-wsp (ESTABLISHED)
node 5126 root 19u IPv4 3021283 0t0 TCP elk1:39036->elk1:wap-wsp (ESTABLISHED)
node 5126 root 20u IPv4 2799479 0t0 TCP elk1:39020->elk1:wap-wsp (ESTABLISHED)
node 5126 root 22u IPv4 2799481 0t0 TCP elk1:39024->elk1:wap-wsp (ESTABLISHED)
node 5126 root 23u IPv4 2790049 0t0 TCP elk1:39026->elk1:wap-wsp (ESTABLISHED)
node 5126 root 24u IPv4 2790051 0t0 TCP elk1:39028->elk1:wap-wsp (ESTABLISHED)
node 5126 root 25u IPv4 2800378 0t0 TCP elk1:39030->elk1:wap-wsp (ESTABLISHED)
(2).执行命令lsof -i UDP
,输出协议类型为UDP的所有项,如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 666 rpc 6u IPv4 23206 0t0 UDP *:sunrpc
rpcbind 666 rpc 7u IPv4 23208 0t0 UDP *:837
rpcbind 666 rpc 9u IPv6 23210 0t0 UDP *:sunrpc
rpcbind 666 rpc 10u IPv6 23211 0t0 UDP *:837
chronyd 676 chrony 5u IPv4 24242 0t0 UDP localhost:323
chronyd 676 chrony 6u IPv6 24243 0t0 UDP localhost:323
5.总结
lsof 在查找关于打开文件的相关信息时经常用到,上面对常用命令参数进行了介绍,更详细的内容可以查看 man 手册。
https://man7.org/linux/man-pages/man8/lsof.8.html
https://www.cnblogs.com/sparkdev/p/10271351.html
https://blog.csdn.net/xifeijian/article/details/9088137
恢复删除的文件
当Linux系统受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。此外,管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。在/proc
目录下,包含了反映内核和进程树的各种文件。/proc
目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与lsof相关的信息都存储于以进程的PID命名的目录中,即/proc/1234
中包含的是PID为1234的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof可以显示进程的文件描述符和相关的文件名等信息。也就是我们可以通过访问进程的文件描述符来找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc
目录下恢复该文件的内容。 假如由于误操作将/var/log/messages
文件删除掉了,那么这时要将/var/log/messages
文件恢复的方法如下,首先使用lsof
来查看当前是否有进程打开/var/log/messages
文件,如下:
lsof|grep /var/log/messages
rsyslogd 62322 root 7w REG 253,0 15908117 134327511 /var/log/messages (deleted)
in:imjour 62322 62328 root 7w REG 253,0 15908117 134327511 /var/log/messages (deleted)
rs:main 62322 62329 root 7w REG 253,0 15908117 134327511 /var/log/messages (deleted)
从上面的信息可以看到PID 62322(rsyslogd)打开文件的文件描述符是7。同时还可以看到/var/log/messages
已经标记被删除了。因此我们可以在/proc/62322/fd/7
(fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
head -n 10 /proc/62322/fd/7
Aug 15 10:35:01 elk1 rsyslogd: [origin software="rsyslogd" swVersion="8.24.0" x-pid="1336" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Aug 15 10:35:02 elk1 rhsmd: In order for Subscription Manager to provide your system with updates, your system must be registered with the Customer Portal. Please enter your Red Hat login to ensure your system is up-to-date.
Aug 15 10:35:04 elk1 systemd: kubelet.service holdoff time over, scheduling restart.
Aug 15 10:35:04 elk1 systemd: Started kubelet: The Kubernetes Node Agent.
Aug 15 10:35:04 elk1 systemd: Starting kubelet: The Kubernetes Node Agent...
Aug 15 10:35:04 elk1 kubelet: F0815 10:35:04.326327 80004 server.go:198] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory
Aug 15 10:35:04 elk1 kubelet: goroutine 1 [running]:
Aug 15 10:35:04 elk1 kubelet: k8s.io/kubernetes/vendor/k8s.io/klog/v2.stacks(0xc000122001, 0xc000136840, 0xfb, 0x14d)
Aug 15 10:35:04 elk1 kubelet: /workspace/anago-v1.19.2-rc.0.12+19706d90d87784/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/k8s.io/klog/v2/klog.go:996 +0xb9
Aug 15 10:35:04 elk1 kubelet: k8s.io/kubernetes/vendor/k8s.io/klog/v2.(*loggingT).output(0x6cf6140, 0xc000000003, 0x0, 0x0, 0xc000b200e0, 0x6b49c19, 0x9, 0xc6, 0xc00005ba00)
从上面的信息可以看出,查看/proc/62322/fd/7
就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用I/O重定向将其复制到文件中,如:cat /proc/62322/fd/7 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。