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


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

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

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

           

  • 相关阅读:
    嵌入式软件打log的一些心得
    Day21——二叉搜索树的最小绝对差、二叉搜索树中的众数 、二叉树的最近公共祖先
    led台灯什么牌子的质量好?目前市面上的led台灯真的对眼睛好吗
    基于flowable的upp(统一流程平台)运行性能优化(2)
    uniAPP小程序 子组件使用watch不生效,H5正常,小程序不正常(其实是子组件model选项的问题)
    数据质量校验
    超神之路 数据结构 2 —— Queue队列实现和循环队列和普通队列的性能比较
    Metabase学习教程:入门-3
    SQL Server批量删除数据库中的表
    2核4G服务器支持多少用户同时在线访问?卡不卡?
  • 原文地址:https://blog.csdn.net/linhao19841211_2/article/details/134408299