Linux删除了大文件为什么磁盘空间没有释放?

某天,收到监控系统的告警信息,说磁盘空间占用过高,登上服务器,使用 df -h 一看,发现磁盘占用率已经 96%了:
在这里插入图片描述

通过查看 /usr/local/nginx/conf/vhost/xxx.conf 找到 access_log 和 error_log 的路径,进去后,du -sh 查看了下总大小,一共占用了 31GB,二话不说,直接 rm xxx_access.log 删除掉nginx的 access_log 文件,然后兴冲冲的 df -h 一看,磁盘空间并没有下降,还是占用96%,什么鬼?

为什么文件被进程占用之后删除不会释放磁盘空间呢?

因为在 Linux 中,文件存储在硬盘上的最小存储单位是扇区(Sector),每个 sector 只有 512字节大小;多个 sector 可以组成文件块 (block) 。当我们读取某个文件数据的时候,操作系统就需要知道这个文件存储在哪个 block 上。文件的数据存放位置信息被存放到了 inode (索引节点)上。也就是说,在 Linux 下,文件由指针部分(inode)和数据部分(data)组成。

因此,执行 rm xxx 命令删除文件的时候,只是删掉了inode数据,而文件的实际数据部分在 inode 被清除掉之后,会被覆盖并写入新的内容。但是如果文件在删除的时候是被打开的(有一个进程正在使用该文件,文件被进程锁定或者有进程一直在向这个文件写数据等)状态,那么进程依旧可以读取该文件,系统就会认为该文件的磁盘空间一直被占用。

虽然删除了 access_log 文件,但是由于 nginx 进程还在一直向这个文件写入内容,文件的 inode 并没有清除掉,系统内核认为文件并未删除,这才出现空间不释放的情况。也就是说:当一个进程持续的写入一个文件的时候,直接删除这个文件,磁盘空间并不会得到释放。

可以通过 lsof | grep deleted | grep access_log 命令查看是不是有进程一直还在写入这个文件:
在这里插入图片描述
可以看到这个文件被进程 nginx 锁定,而且 nginx 进程一直在往这个文件写数据,最后一列的 deleted 状态表示这个文件已经被删除。由于进程还在一直往里面写数据,导致磁盘空间并未释放。

解决方案:

  • 方法1:写入一个空数据到这个文件中:cat /dev/null > /home/wwwlogs/access.log 或者 echo " " > /home/wwwlogs/access.log
  • 方法2:重启 nginx 进程让操作系统回收磁盘空间: /usr/local/nginx/sbin/nginx -s reload

这样操作后,磁盘空间直接下降了:
在这里插入图片描述
另外,有一些查看文件相关的命令,记录下来备用:

# 查看当前磁盘占用
df -h# 查看当前目录大小
du -sh# 查看当前目录下第一层文件夹的大小,按照由大到小排序
du -sh * | sort -rh (文件过多的话,可以加 | less)# 同上,但可以指定层级
du -lh --max-depth=1 | sort -rh# 查看进程打开的文件
lsof | grep xxx (记得加上grep,否则返回的数据会很多)

后续工作:
由于此前没有对nginx的日志进行切割,导致nginx的日志文件越来越大,因此,需要写一个shell脚本,通过定时任务按照每天(或者其他自定义维度)对日志文件切割存储,并自动删除一段时间之前的日志文件。

shell脚本文件:vim /root/cut_nginx_log.sh

#!/bin/bash
#日期参数   
date=`date -d "yesterday" +"%Y%m%d"`# 复制原来的日志文件
cp /home/wwwlogs/access.log /home/wwwlogs/backup/access_${date}.log# 清空原有的日志文件
cat /dev/null > /home/wwwlogs/access.log# 删除7天前的日志文件
find /home/wwwlogs/backup -mtime 7 -type f -name \*.log | xargs rm -f

增加执行权限: chmod +x /root/cut_nginx_log.sh

定时任务:crontab -e

0 0 * * *  /root/cut_nginx_log.sh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于python的FMCW雷达工作原理仿真

这篇文章将介绍如何使用python来实现FMCW工作原理的仿真,第1章内容将介绍距离检测原理,第2章内容会介绍速度检测原理。 第1章 第1部分: 距离检测原理 调制的连续波雷达通常也被叫做调频连续波(FMCW)雷达是一个使用频率调制来测量…

华为云obs在java中的使用

1、申请obs服务。 申请完成后,会获得以下几个配置信息: AK"****************************"; SK"******************************************************"; ENDPOINT"obs.*************************"; BUCKET_NAME&q…

2023年12月2日历史上的今天大事件早读

823年12月2日 《门罗宣言》发表 1908年12月2日 末代皇帝溥仪登基 1919年12月2日 平江开展驱除湘督张敬尧运动 1929年12月2日 北平周口店发现中国猿人头盖骨 1941年12月2日 美裔华人物理学家朱经武出生 1949年12月2日 中央决定发行人民胜利公债 1952年12月2日 拿破仑三世成…

SQL练习2

1.查询student表的所有记录 mysql> select * from student; --------------------------------------------------------------- | id | name | sex | birth | department | address | -------------------------------------------------------------…

Linux:vim的简单使用

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、vim的基本概念二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、.xxx.swp的解决总结 前言 本文是对Linux中vim使用的总结 一、vim的基本概念 …

NodeJs(一):初识nodejs、模块化、CommonJS、ESModule等

目录 (一)Nodejs简介 1.nodejs是什么 2.nodejs架构 3.nodejs的应用场景 (二)准备工作 1.安装nodejs 2.nodejs版本管理工具 (三)nodejs的使用 1.node的输入 2.node的输出 3.其他的console方法 (四)全局对象 1.常见的全局对象 2.特殊的全局对象 3.global和window的…

(详细教程)笔记本电脑安装Ubuntu系统

1.前言 老的小米笔记本淘汰了,装一下linux系统玩一下。 使用工具如下:一台小米笔记本pro15.6一个惠普32G U盘一个台式机用于下载镜像等资源 2.下载Ubuntu桌面版 cn.ubuntu.com/download/de… 这里我下载的是 22.04.3 LTS 3.下载烧录工具&#xff0c…

微信开发者工具真机调试连接状态在正常和未连接之间反复横跳

开启局域网模式能解决这个问题,目前只找到这一个方法

【C/PTA —— 13.指针2(课内实践)】

C/PTA —— 13.指针2(课内实践) 一.函数题6-1使用函数实现字符串部分复制6-2 拆分实数的整数部分和小数部分6-3 存在感 二.编程题7-1 单词反转 一.函数题 6-1使用函数实现字符串部分复制 void strmcpy(char* t, int m, char* s) {int len 0;char* ret …

nvidia安装出现7-zip crc error解决办法

解决办法:下载network版本,重新安装。(选择自己需要的版本) 网址:CUDA Toolkit 12.3 Update 1 Downloads | NVIDIA Developer 分析原因:local版本的安装包可能在下载过程中出现损坏。 本人尝试过全网说的…

从0开始学习JavaScript--JavaScript ES6 模块系统

JavaScript ES6(ECMAScript 2015)引入了官方支持的模块系统,使得前端开发更加现代化和模块化。本文将深入探讨 ES6 模块系统的各个方面,通过丰富的示例代码详细展示其核心概念和实际应用。 ES6 模块的基本概念 1 模块的导出 ES…

java基于Spring Boot+vue的民宿客房租赁预订系统的设计与实现含源码数据库

民宿租赁系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为IDEA,选择的数据库工具为Mysql。以此搭建开发环境实现民宿租赁系统的功能。其中管理员管理用户,新闻公告。 民宿租赁系统是一款运用软件开发技术设计…