当前位置: 首页 > news >正文

linux rm文件后空间不释放怎么处理

        如题,rm文件后,使用df -h看可用空间,并未增加,这是怎么回事?原来,是有进程在访问这个文件,使用“lsof | grep delete”找到进程并kill掉,此时再看可用空间,便增加了。

        我们再复现一下,首先这里用perl写了一个demo程序,代码如下:

#! /usr/bin/env perl
# 用来测试程序写文件时,rm文件后通过lsof | grep delete查找仍在访问已删除文件的进程
# 该程序每隔1s往文件追加写入1行,依次写入1、2、3...,写到1000000时,又会从1开始继续写,以此循环
# 循环的目的是让程序可以持续在写文件,方便观察文件内容的变化
use strict;my $filePathName = "/tmp/ubuntu-12.04.5-desktop-i386.iso";
open (MYFILE, ">>$filePathName") or die ("\nError: 创建并打开文件失败: $filePathName 由于: $!\n");
for (my $i = 1; $i <= 1000000; $i++) {sleep(1);print MYFILE $i . "\n";MYFILE->autoflush(1);if ($i == 1000000) {$i = 0;}
}
close (MYFILE);

        这里为了效果明显,往/tmp目录放了一个756MB的ubuntu的iso文件,perl程序以追加模式往该文件写数据,每秒写1行数据。此时我们在1个shell窗口把该perl程序跑起来:

$ ./WriteToFile.pl

         再打开1个shell窗口,执行以下命令:

$ df -m
Filesystem          1M-blocks  Used Available Use% Mounted on
devtmpfs                 1936     0      1936   0% /dev
tmpfs                    1965     0      1965   0% /dev/shm
tmpfs                    1965    10      1956   1% /run
tmpfs                    1965     0      1965   0% /sys/fs/cgroup
/dev/mapper/cl-root     65980 23587     42393  36% /
/dev/sda1                1014   288       727  29% /boot
/dev/mapper/cl-home     32213   616     31597   2% /home
osshare                 99900 39424     60477  40% /media/sf_osshare
tmpfs                     393     1       393   1% /run/user/1000

$ rm /tmp/ubuntu-12.04.5-desktop-i386.iso

$ df -m
Filesystem          1M-blocks  Used Available Use% Mounted on
devtmpfs                 1936     0      1936   0% /dev
tmpfs                    1965     0      1965   0% /dev/shm
tmpfs                    1965    10      1956   1% /run
tmpfs                    1965     0      1965   0% /sys/fs/cgroup
/dev/mapper/cl-root     65980 23586     42394  36% /
/dev/sda1                1014   288       727  29% /boot
/dev/mapper/cl-home     32213   616     31597   2% /home
osshare                 99900 39424     60477  40% /media/sf_osshare
tmpfs                     393     1       393   1% /run/user/1000

        这里我们看到删除文件后,使用空间几乎没有变化,这是因为perl程序正在访问该文件,虽然文件被删除了,但是inode并未释放,所以磁盘空间不会释放。这时我们执行如下命令:

$ lsof | grep delete

此处省略一些结果

4      47662 /memfd:wayland-cursor (deleted)
gnome-ter 2671 2909 pool              mousel    6u      REG                0,1   1177344      47662 /memfd:wayland-cursor (deleted)
perl      3088                        mousel    3w      REG              253,0 792723594   68232356 /tmp/ubuntu-12.04.5-desktop-i386.iso (deleted)

$ cd /proc/3088/fd
$ ll
total 0
lrwx------. 1 mousel mousel 64 Nov 14 21:42 0 -> /dev/pts/2
lrwx------. 1 mousel mousel 64 Nov 14 21:42 1 -> /dev/pts/2
lrwx------. 1 mousel mousel 64 Nov 14 21:42 2 -> /dev/pts/2
l-wx------. 1 mousel mousel 64 Nov 14 21:42 3 -> '/tmp/ubuntu-12.04.5-desktop-i386.iso (deleted)'

        这时我们可以看到该文件被3088的pid进程访问着,也就是perl程序,进入/proc/<pid>/fd可以看到文件描述符3指向了该文件,这时我们将进程kill掉,硬盘空间就可以释放了。

$ kill -9 3088

$ df -m
Filesystem          1M-blocks  Used Available Use% Mounted on
devtmpfs                 1936     0      1936   0% /dev
tmpfs                    1965     0      1965   0% /dev/shm
tmpfs                    1965    10      1956   1% /run
tmpfs                    1965     0      1965   0% /sys/fs/cgroup
/dev/mapper/cl-root     65980 22830     43150  35% /
/dev/sda1                1014   288       727  29% /boot
/dev/mapper/cl-home     32213   616     31597   2% /home
osshare                 99900 39427     60474  40% /media/sf_osshare
tmpfs                     393     1       393   1% /run/user/1000

        此时还可以还原删除的文件,可以执行如下命令,由于perl程序一直在对文件执行写操作,还原的内容为执行cp时的内容

$ cp /proc/3088/fd/3 /tmp/backup.iso

       

相关文章:

linux rm文件后空间不释放怎么处理

如题&#xff0c;rm文件后&#xff0c;使用df -h看可用空间&#xff0c;并未增加&#xff0c;这是怎么回事&#xff1f;原来&#xff0c;是有进程在访问这个文件&#xff0c;使用“lsof | grep delete”找到进程并kill掉&#xff0c;此时再看可用空间&#xff0c;便增加了。 我…...

vue中el-tree树形组件利用filter和 filterNode方法实现模糊搜索

具体详情可见...

克鲁斯卡尔算法(C++)

目录 克鲁斯卡尔算法 ​编辑代码&#xff1a; 结果&#xff1a; 克鲁斯卡尔算法 克鲁斯卡尔算法是一种用于求解最小生成树的算法。最小生成树是指一棵包含了所有节点的连通图&#xff0c;并且边的权值之和最小。 克鲁斯卡尔算法的基本思想是&#xff0c;每次选择图中最小的…...

【Shell脚本 4】测试用

#!/usr/bin/env bash ​ # --------------------------------------------------------------------------------- # 控制台颜色 BLACK"\033[1;30m" RED"\033[1;31m" GREEN"\033[1;32m" YELLOW"\033[1;33m" BLUE"\033[1;34m"…...

DC电源模块对效率有什么要求?

BOSHIDA DC电源模块对效率有什么要求&#xff1f; DC电源模块是现代科技中非常重要的组成部分&#xff0c;它是将交流电转换为直流电的装置&#xff0c;可以提供稳定的电源给各种设备和系统使用。效率是DC电源模块的一个关键性能指标&#xff0c;直接影响着模块的整体性能和效…...

Linux在线安装MySQL8.0.24安装、MySQL数据备份和恢复

一、 Linux在线安装MySQL8.0.24 如果机器上已经有MySQL5.7版本需要先卸载 首先&#xff0c;需要停止MySQL服务。可以通过以下命令来停止服务&#xff1a; sudo systemctl stop mysqld接下来&#xff0c;我们需要卸载MySQL5.7。可以通过以下命令来卸载&#xff1a; sudo yum…...

【python】OpenCV—Rectangle, Circle, Selective Search(1.2)

文章目录 1 画框画圈1.1 画矩形框1.2 画圆 / 点1.3 椭圆 2 Selective Search3 Resize 1 画框画圈 1.1 画矩形框 # Copy the image img_rgb_copy img_rgb.copy()# Draw a rectangle cv2.rectangle(img_rgb_copy, pt1 (405, 90), pt2 (740, 510),color (255, 0, 0), thickne…...

MongoDB是一个NoSQL数据库,有着多种不同的命令和操作。以下是一些常见的MongoDB命令:

show dbs&#xff1a;列出所有数据库use db_name&#xff1a;切换到指定的数据库db.dropDatabase()&#xff1a;删除当前数据库db.createCollection("collection_name")&#xff1a;创建集合db.collection_name.insert(document)&#xff1a;向指定集合插入数据db.co…...

网络运维Day19

文章目录 环境准备数据备份为什么要备份什么是备份备份到哪里什么时候备份如何备份 完整备份物理备份逻辑备份测试恢复所有库 构建MySQL服务xtrabackup完全备份与恢复完全备份完全恢复增量备份增量恢复 总结 环境准备 IP地址采用自动分配&#xff0c;以自己的为准 可以将之前的…...

颜色标记txt和多根走线【Cadance进阶】

文章目录 前言颜色标记txt多根走线 前言 今天来介绍个基础操作中不常见的&#xff0c;但是非常实用的技巧。第一个是颜色标记&#xff0c;它是与text文件结合&#xff0c;根据text文件中的网络来染色标记的&#xff0c;致力于找出那些特定的走线&#xff0c;或者是查询出现问题…...

你是想被ChatGPT改变,还是改变软件开发的未来?丨IDCF

人工智能技术的发展&#xff0c;正在深刻地改变着我们的生活和工作方式。在软件工程领域&#xff0c;ChatGPT作为一种新兴的人工智能技术&#xff0c;正在逐渐地被应用到软件开发的各个环节中。那么&#xff0c;ChatGPT对每个人的影响是什么呢&#xff1f; 一、对软件开发人员…...

Homography详解在MVSNet中的应用

Homography&#xff08;单应性变换&#xff09;是计算机视觉中的一个重要概念&#xff0c;用于描述两个平面之间的透视关系。在图像处理和计算机视觉中&#xff0c;Homography通常表示两个平面之间的投影关系&#xff0c;这种关系可以通过一个3x3的矩阵来表示。 在数学上&…...

linux parted给磁盘分区

概述 通常我们用的比较多的分区工具是fdisk命令&#xff0c;但由于fdisk只支持MBR分区&#xff0c;MBR分区表最大支撑2T的磁盘&#xff0c;所以无法划分大于2T的分区。而parted工具可以划分单个分区大于2T的GPT格式的分区&#xff0c;也可以划分普通的MBR分区。 1.查看磁盘大小…...

大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

使用 PYTORCH 进行图像风格迁移

一、介绍 本教程介绍如何实现 由 Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 开发的神经风格算法。神经风格或神经传输允许您拍摄图像并以新的艺术风格再现它。该算法采用三幅图像&#xff0c;即输入图像、内容图像和风格图像&#xff0c;并将输入更改为类似于内容…...

vscode使用flake8设置单行最长字符限制设置失败的问题

vscode使用flake8设置单行最长字符限制设置失败的问题 问题描述解决方案 问题描述 如图所示&#xff0c;使用flake8单行字数过长&#xff0c;就会有有红色底的波浪线 一般情况下很多教程都会让你在setting.json里面设置 但是我打开我的setting.json&#xff0c;发现我已经进…...

SAP KO22内部订单预算BAPI与BDC

KO22可以为内部订单预先维护预算&#xff0c;以便在后续成本实际产生时进行控制。 使用BAPI进行创建&#xff1a;KBPP_EXTERN_UPDATE_CO SAP note 625613中对该BAPI的使用方式有详细介绍&#xff0c;使用时可进行参考。 年度预算&#xff1a;e_gjahr传值、e_ges置空&#xff…...

K8S篇之实现利用Prometheus监控pod的实时数据指标

一、监控部署 1、将k8s集群中kube-state-metrics指标进行收集&#xff0c;服务进行部署 1.1 pod性能指标&#xff08;k8s集群组件自动集成&#xff09; k8s组件本身提供组件自身运行的监控指标以及容器相关的监控指标。通过cAdvisor 是一个开源的分析容器资源使用率和性能特性的…...

智能巡检软件怎么选?企业设备管理需要做什么?

在当今竞争激烈的企业运营环境中&#xff0c;巡检管理的重要性不言而喻。然而&#xff0c;许多企业在执行巡检任务时面临着诸多挑战&#xff0c;如员工执行不到位、缺乏有效的人员监管、漏检误检、安全隐患以及数据整理困难等问题。这些问题如果不能得到妥善解决&#xff0c;不…...

【python】Django——连接mysql数据库

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——连接mysql数据库 连接MySQL数据库…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...