首页 > 系统相关 >Linux系统删除文件后空间并没有释放原因及解决方法

Linux系统删除文件后空间并没有释放原因及解决方法

时间:2022-10-04 19:56:43浏览次数:45  
标签:文件 释放 log 删除 nginx Linux var root logs

Linux系统删除文件后空间并没有释放原因及解决方法

今日收到监控报警,发现一台服务器的磁盘空间不足,需要进行处理,登录后发现可利用率不足1%,进行相关查看和处理工作;但是操作删除了一些备份文件和日志信息后,查看空间仍然不足。

一、现象描述

操作系统:CentOS 6.8 x64

使用 df -h 命令,看见 / 根目录下磁盘空间已满(99%),于是手动清理大日志文件。

 
  1. [root@local ~]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/mapper/rootvg-LogVol00 59G 59G 0 100% /
  4. /dev/sda1 190M 13M 168M 8% /boot
  5. tmpfs 2.0G 0 2.0G 0% /dev/shm

通过 du -sh 命令,找到占用大量空间的日志文件,于是使用 rm -rf 删除了它。

 
  1. [root@local ~]# cd /var/nginx/logs/
  2. [root@local ~]# rm -rf t-access.log t-error.log

然后 查看磁盘空间的使用情况,发现 / (根目录)的空间并没有发生变化。但是可以看到 Used 发生了变化。

 
  1. [root@local ~]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/mapper/rootvg-LogVol00 59G 56G 0 100% /
  4. /dev/sda1 190M 13M 168M 8% /boot
  5. tmpfs 2.0G 0 2.0G 0% /dev/shm

这是怎么回事呢?

二、原因分析

未释放磁盘空间的原因:

在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的文件夹结构上解除链接(unlink),然而假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。而我删除的是nginx的访问日志文件,在删除的时候该文件正在被使用。

三、解决办法

首先获得一个已经被删除的可是仍然被应用程序占用的文件列表。操作如下:

 
  1. [root@local ~]# lsof |grep deleted
  2. nginx 4399 root 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
  3. nginx 4399 root 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
  4. nginx 4401 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
  5. nginx 4401 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
  6. nginx 4402 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
  7. nginx 4402 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
  8. nginx 4403 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
  9. nginx 4403 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)
  10. nginx 4404 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)
  11. nginx 4404 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)

从输出的结果可以看到 /var/nginx/logs/t-access.log 和 t-error.log 还在被使用中,所以导致未释放空间。

那么如何让进程释放呢?

方法1:直接 kill 掉相应的进程,或者停掉使用这个文件的应用,让操作系统自己主动回收磁盘空间。

由于还有其他项目正在使用该应用(nginx服务),所以不能停掉nginx服务,于是使用 kill 命令删除相应的进程。

 
  1. [root@local ~]# kill -9 4399
  2. [root@local ~]# kill -9 4401
  3. [root@local ~]# kill -9 4402
  4. [root@local ~]# kill -9 4403
  5. [root@local ~]# kill -9 4404

再次,查看磁盘空间的使用情况,发现空间已经被回收了。

 
  1. [root@local ~]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/mapper/rootvg-LogVol00 59G 56G 0 95% /
  4. /dev/sda1 190M 13M 168M 8% /boot
  5. tmpfs 2.0G 0 2.0G 0% /dev/shm

方法2:以后清理正在被读写的大日志文件时,直接使用 echo "" > xxx.log 命令,即直接将文件置空,并不影响服务的使用,文件大小也被控制下来,磁盘空间也释放了。

说明:

当Linux打开一个文件的时候,Linux内核会为每个进程在/proc/ 『/proc/nnnn/fd/文件夹(nnnn为pid)』建立一个以其pid为名的文件夹用来保存进程的相关信息,而其子文件夹fd保存的是该进程打开的全部文件的fd(fd:file descriptor)。

kill进程是通过截断proc文件系统中的文件能够强制要求系统回收分配给正在使用的的文件。这是一项高级技术,仅到管理员确定不会对执行中的进程造成影响时使用。应用程序对这样的方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。

四、删除原理

一般来说,不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程在使用这个文件,例如输出日志文件,要了解这个问题,就需要知道Linux下文件的存储机制和存储结构。

一个文件在文件系统中由两个部分构成:数据和指针。指针位于文件系统的meta-data中,数据被删除后,指针被清除,而数部分还是存储在磁盘中,只不过数据对应的指针被清除后,文件数据部分占用的空间就可以被覆盖了。之所以出现删除大文件后,空间还没有释放,就是因为有进程一直在使用这个文件的指针,日志文件的服务还在运行,导致虽然删除了日志大文件,但文件对应的指针部分由于被进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统就认为文件并未被删除,所以使用 df 命令查看还是 100%。

 

 

来自:

https://www.huhexian.com/32025.html

标签:文件,释放,log,删除,nginx,Linux,var,root,logs
From: https://www.cnblogs.com/shttke/p/16754312.html

相关文章

  • VSCode阅读Linux源码(35)
    环境经测试在以下环境上编译成功或编译失败:Ubuntu2004LTS(非虚拟机,真实系统),Ubuntu2204LTS(VMware虚拟机)环境上编译成功;Ubuntu2004LTS(Hyper-V系统),Ubuntu2204......
  • Linux进程间通信——使用信号量
    一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码......
  • Tubian Linux 0.45,兼容Windows和Android的国产Linux系统!
    Github主页(提供下载):https://github.com/jinshulumengchuang/Tubian-Linux123网盘下载:https://www.123pan.com/s/XjkKVv-JO9Uvhttps://www.123pan.com/s/XjkKVv-BO9Uvhtt......
  • 如何在 Linux 中扩展 XFS 根分区
    在某些情况下,/分区在 ​​Linux​​​ 中磁盘空间不足。即使压缩和删除旧的日志文件也无济于事,因此在这种情况下,我们别无选择,只能扩展/文件系统。在本文中,我们将演示如......
  • Linux的bg和fg, nohup命令
    1.nohuphttp://www.cnblogs.com/kapok/archive/2005/11/23/283108.html要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦;另一种方法是仍然用普......
  • docker安装linux镜像制作,制作Docker镜像的两种方式
    dockertagyuanhuan/newcontainer1docker账号名称/dev:77dockerpushdocker账号名称/dev:77转载自:https://blog.csdn.net/weixin_39821604/article/details......
  • KAL1 LINUX 官方网站 --- 首页
    最先进的渗透测试发行版KaliLinux是一个开源的,基于Debian的Linux发行版,面向各种信息安全任务,如渗透测试,安全研究,计算机取证和逆向工程。 行业标准KaliLinux不是指它的......
  • linux配置前端npm yarn
    linux配置前端npmyarn这几天更新了windows系统,安装一下wsl,试一下之前就想用的zsh,感觉还不错。之后就直接用Linux接管windows命令。现在安装一下前端常用的工具npm......
  • linux上安装Nginx教程
    可以参看这篇文章,讲的还挺详细的https://mp.weixin.qq.com/s?src=11&timestamp=1664862961&ver=4083&signature=AwBtRAlZqq-6OZhpt54f*9dYKgC1a-ELmTRisXMt8oCDb-it*3mDOtA......
  • linux常用命令
    linux开放指定端口命令 1、开启防火墙systemctlstartfirewalld 查看防火墙状态systemctlstatusfirewalld 2、开放指定端口firewall-cmd--zone=public--add-por......