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.mzph.cn/news/188732.shtml

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

相关文章

SDX12 上层应用gdb调试及环境搭建

SDX12 上层应用gdb调试及环境搭建 1. 问题背景2 环境搭建3 操作步骤4. 调试过程5 实现效果6 附录 1. 问题背景 上层应用在问题定位的过程中,现有手段只能有有限的log打印,通常情况下很难定位问题。如果想在应用程序执行的过程中查看任意调用关系或者数据…

6.1810: Operating System Engineering <Lab2 syscall: System calls>

课程链接:6.1810 / Fall 2023 一、本节任务 二、要点 操作系统要满足三要素:并发、隔离、交互(multiplexing, isolation, and interaction)。 宏内核(monolithic kernel):是操作系统核心架构…

temu上新待确认在哪里点

在Temu平台上,作为卖家,您可能需要上架新的商品以吸引更多的买家。下面是一般的步骤,但请注意,不同平台的操作可能略有不同,具体请参考Temu官方的帮助文档或联系客服。 先给大家推荐一款拼多多/temu运营工具——多多情…

pathlib --- 面向对象的文件系统路径

目录 基础使用 纯路径 通用性质 运算符 访问个别部分 方法和特征属性 具体路径 方法 对应的 os 模块的工具 3.4 新版功能. 源代码 Lib/pathlib.py 该模块提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 …

k8s部署jenkins

1.先决条件 1.因为国内的容器镜像加速器无法实时更新docker hub上的镜像资源.所以可以自己进行jenkins的容器镜像创建,. 2.这里用到了storageClass k8s的动态制备.详情参考: k8s-StoargClass的使用-基于nfs-CSDN博客 3.安装docker服务.(用于构建docker image) 2.构建jenki…

Mac右键添加通过VSCode打开

Mac右键添加通过VSCode打开 1 首先打开自动操作 进入方式 访达 – 应用程序 – 自动操作 2. 选择快速操作 3. 添加 最后 commands保存,可以输入自定义的名称 for f in "$" doopen -a "Visual Studio Code" "$f" done4. 找到保存的快…

KaiwuDB 多模数据库-时序性能优化

随着物联网领域的快速发展,时序数据的产生和处理需求不断增长。为了满足实时性、高效性和准确性的要求,数据库需要进行时序性能优化,以提供快速的数据写入、实时查询和高效的数据存储与处理能力。 本期直播介绍了时序数据和时序数据库特征以…

树莓派3B+ PCB叠层设计

板子废了&#xff0c;用电磨切了下&#xff0c;看看是什么叠层。 由于有BCM43455 WIFI芯片&#xff0c;这个是0.3ball 0.4pitch&#xff0c;肯定是要用盲孔布线的。 然后根据这个切面看&#xff0c;板子是6层的&#xff0c;外层内层铜厚应该是一样的 1-2层介质特别薄竟然<1o…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X&#xff0c;对于每个 X&#xff0c;输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数&#xff0c;返回二维数组周边元素的平均值&#xff0c;M为定义好的符号常量。 编写double fun(int a[M])函…

小米智能摄像头mp4多碎片手工恢复案例

小米智能摄像头mp4多碎片手工恢复案例 智能摄像头目前在市场上极为常见&#xff0c;仅需要一张存储卡即可实现视频、音频的采集&#xff0c;同时可以通过手机APP进行远程控制&#xff0c;相比传统安防品牌成本更低、更容易部署。在智能摄像头品牌中小米算是绝对的大厂&#xf…

折扣因子的变化图(Python)

var 3 var_list [3] for _ in range(50):var * .95var_list.append(var)import matplotlib.pyplot as plt import numpy as np plt.plot(np.arange(len(var_list)), var_list, linewidth1) plt.show()

Mysql的分库分表

一、单Mysql节点 假如一主一从 为什么不能无限读&#xff1f; 瓶颈分析&#xff1a; 资源限制&#xff1a; 如CPU、内存、磁盘I/O、网络带宽等。随着读请求的增加&#xff0c;服务器的负载将会增加&#xff0c;甚至可能导致系统崩溃。 连接数限制&#xff1a; MySQL有最大连…

uniapp 使用web-view外接三方

来源 前阵子有个需求是需要在原有的项目上加入一个电子签名的功能&#xff0c;为了兼容性和复用性后面解决方法是将这个电子签名写在一个新的项目中&#xff0c;然后原有的项目使用web-view接入这个电子签名项目&#xff1b; 最近又有一个需求&#xff0c;是需要接入第三方的…

【前端】浅谈async/await异步传染性

文章目录 概述观点无法解决可以解决 来源 概述 "异步传染性"问题通常是指&#xff0c;当一个函数使用了async和await&#xff0c;其调用者也需要使用async和await处理异步操作&#xff0c;导致整个调用链都变成异步的。这种情况可能导致代码变得更复杂&#xff0c;不…

WSL2 docker GUI 界面

在 WSL2 docker 中运行GUI界面。 具体流程和远程显示Ubuntu界面类似&#xff0c;链接, 更简单一点&#xff0c; 少了 ssh 的部分。 安装好wsl2 和 docker wsl2 运行GUI程序&#xff0c;windows 会默认弹出窗口。 可以安装 gedit 测试一下 windows 下载并运行 Xlaunch. 运行 d…

轻松配置PPPoE连接:路由器设置和步骤详解

在家庭网络环境中&#xff0c;我们经常使用PPPoE&#xff08;点对点协议过夜&#xff09;连接来接入宽带互联网。然而&#xff0c;对于一些没有网络专业知识的人来说&#xff0c;配置PPPoE连接可能会有些困难。在本文中&#xff0c;我将详细介绍如何轻松配置PPPoE连接&#xff…

FO-like Transformation in QROM Oracle Cloning

参考文献&#xff1a; [RS91] Rackoff C, Simon D R. Non-interactive zero-knowledge proof of knowledge and chosen ciphertext attack[C]//Annual international cryptology conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 1991: 433-444.[BR93] Bellare M…

Python知识碎片补充【侯小啾python领航班系列(十四)】

Python知识碎片补充【侯小啾python领航班系列(十四)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

与原有视频会议系统对接

要实现与原有视频会议系统对接&#xff0c;需要确保通信协议的一致性。连通宝视频会议系统可与第三方视频会议系统对接。实现与第三方会议系统对接还可以使用会议室连接器&#xff0c;可以确保不同系统之间的数据传输和交互。 具体对接流程可能因不同品牌和类型的视频会议系统而…

Matlab 点云线性指数计算(加权)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 思路其实很简单,即对每个邻近点集中的点,根据其到点集中心的距离进行加权处理(权重函数),之后再基于加权之后的点获取其协方差矩阵,最后再求取其相关的特征值,以此来获取该点的线性指数。相关公式如下所示:…