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

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

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

perl 复制代码
#! /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

相关推荐
韩楚风4 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学4 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO4 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu74 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我4 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、4 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程4 小时前
Linux中环境变量
linux
挥剑决浮云 -5 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
小O_好好学6 小时前
CentOS 7文件系统
linux·运维·centos
x晕x6 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器