一、Linux服务器上文件已删除但空间没有释放原因说明
1、问题说明
查看某台centos6.7日志服务器发现磁盘空间已经达到100%,删除存放日志路径下的文件后,发现空间并未释放。
2、问题分析
在linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink).然而假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。
通过命令lsof查看是否有已删除文件占用空间(lsof +L1或lsof | grep delete)。
从上图可以看出有大量库表文件被删除但仍然在数据库中运行占用空间 ,所以导致出现rm删除文件但磁盘空间未得到释放的情况,SIZE列为文件占用的空间大小。
3、解决方法
根据上图可以看出啊占用已删除文件的进程是数据库,可以重启数据库MySQL来释放进程,也可以重启服务器。
如遇到 Apache、Tomcat、Nginx 等 Web 服务产生的日志文件,无法在生产环境上重启,可以选择在线清空日志的方法 echo " " >路径+日志名
二、lsof命令解析
lsof全名list opened files,也就是列举系统中已经被打开的文件。在linux环境中,都是以文件形式存放的,设备是文件,文件夹是文件,甚至sockets也是文件。所以,用好lsof命令,它可以显示系统中所有打开的文件,包括网络连接、管道、设备、目录和普通文件等,对日常的linux管理非常有帮助。
基础命令格式:lsof [options] [names]
1、命令输出字段解析
lsof是linux最常使用的命令之中的一个,通常的输出格式为:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
常见包含例如以下几个字段:
- COMMAND:进程的名称
- PID:进程标识符
- USER:进程所有者
- FD:文件描述符,cwd、txt、err等
- TYPE:文件类型,例如REG(常规)、DIR(目录)、CHR(字符设备)等
- DEVICE:设备编号
- SIZE/OFF:文件大小或节点,假设不能用大小表示的,会留空,使用-s參数控制
- NODE:索引节点
- NAME:文件路径名,挂载点和文件的全路径(链接会被解析为实际路径),或者连接两方的地址和端口、状态等
文件描述符FD解析:
cwd current working directory;
Lnn library references (AIX);
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);
txt program text (code and data);
v86 VP/ix mapped file;文件的File Descriptor number显示模式有:
r for read access;
w for write access;
u for read and write access;
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part of the file;
X for an SCO OpenServer Xenix lock on the entire file;
space if there is no lock.
2、常用的lsof命令选项
下面是一些常用的lsof命令选项:
-a:表示逻辑与,用于指定多个过滤条件之间的关系;
-b
:不重新读取已打开文件的信息,防止系统阻塞;-c:表示按进程名过滤;
-d:表示按文件描述符过滤;
-D <directory>
:搜索某个目录下被打开的文件-g:表示按组ID过滤;
-i:表示按网络连接过滤;
-p:表示按进程ID过滤;
-u:表示按用户ID过滤;
-t:表示只输出进程ID;
-F:表示指定输出格式;
-h:表示不显示列名;
-n:表示不解析主机名;
-P:表示不解析端口号;
-r:表示指定输出间隔时间;
-s:表示按文件大小过滤;
-T:表示指定输出格式。
3、lsof常见用法举例
要列出所有打开的文件,可以使用以下命令:
lsof
要列出指定进程打开的文件,可以使用以下命令:
lsof -p <指定进程pid>
要列出指定用户打开的文件,可以使用以下命令:
lsof -u <username>
要列出指定文件名的进程,可以使用以下命令:
lsof <filename>
要列出指定端口号的进程,可以使用以下命令:
lsof -i :<port>
要列出指定目录下打开的文件,可以使用以下命令:
lsof <directory>
要列出删除但磁盘空间未释放的文件,可以使用以下命令:
lsof | grep delete
lsof +L1
要列出某个进程打开的文件,可以使用以下命令:
lsof -c 进程名
要列出按照文件夹/home/oracle来搜寻,但不会打开子文件夹,用来显示文件夹下被进程开启的文件,可以使用以下命令:
lsof +d /home/oracle
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tnslsnr 3520 oracle cwd DIR 253,5 4096 11059201 /home/oracle
要列出打开/home/oracle文件夹以及其子文件夹搜寻,用来显示文件夹下被进程开启的文件 ,可以使用以下命令:
lsof +D /home/oracle
除了以上常用的选项外,lsof还支持很多其他的选项,可以通过man lsof命令查看完整的帮助文档。