Linux服务器上文件已删除但空间没有释放原因说明及命令losf命令解析

一、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命令查看完整的帮助文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亲爱的老少女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值