IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Linux:删除文件后,磁盘空间没有立即释放

    Adamhuan发表于 2017-03-01 03:25:04
    love 0

    有时候,在Linux删除一个大文件的时候,你会发现磁盘空间并没有释放出来。

    比方说下面这样的情况:

    磁盘空间满:

    [root@mha1 ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_mha1-lv_root
                           42G   42G     0 100% /
    tmpfs                 7.9G   88K  7.9G   1% /dev/shm
    /dev/sda1             485M   37M  423M   8% /boot
    [root@mha1 ~]#

    最后,找到占用磁盘空间的是一个日志文件:nohup.out,如下:

    [root@mha1 ~]# cd /script/
    [root@mha1 script]# ls
    mha  nohup.out  shell
    [root@mha1 script]# 
    [root@mha1 script]# du -sh *
    44K     mha
    16K     nohup.out
    15G     shell
    [root@mha1 script]# cd shell/
    [root@mha1 shell]# ls
    call_do_mha.sh  do_mha.sh  do_mha.sh_orig  nohup.out
    [root@mha1 shell]# 
    [root@mha1 shell]# du -sh *
    4.0K    call_do_mha.sh
    8.0K    do_mha.sh
    8.0K    do_mha.sh_orig
    15G     nohup.out
    [root@mha1 shell]#

    将该日志文件删除:

    [root@mha1 shell]# rm -rf nohup.out 
    [root@mha1 shell]# ls
    call_do_mha.sh  do_mha.sh  do_mha.sh_orig
    [root@mha1 shell]#

    再次查看空间:

    [root@mha1 script]# du -sh *
    44K     mha
    16K     nohup.out
    24K     shell
    [root@mha1 script]# 
    [root@mha1 script]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_mha1-lv_root
                           42G   42G     0 100% /
    tmpfs                 7.9G   88K  7.9G   1% /dev/shm
    /dev/sda1             485M   37M  423M   8% /boot
    [root@mha1 script]#

    可以看到,文件确实被删除了;但是空间也确实没有释放出来。

    问题原因:
    在Linux中,通过rm删除的文件,会从文件系统中unlink。
    但是,如果目标文件当前被使用(被某个进程占用),该进程仍然读取改文件,那么磁盘空间也会一直被占用,而不会被立即释放。

    看看是什么进程在占用我刚才删除的文件:

    [root@mha1 script]# lsof | grep --color "(deleted)" | grep "/script/shell/nohup.out"
    perl        543      root    1w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    perl        543      root    2w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh         2493      root    1w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh         2493      root    2w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh        31368      root    1w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh        31368      root    2w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    [root@mha1 script]# 
    
    [root@mha1 script]# ps -ef | grep --color 31368
    root     31368     1  1 Feb13 ?        03:53:33 sh call_do_mha.sh masterha_application_2_149_174
    root     31825 12118  0 11:14 pts/0    00:00:00 grep --color 31368
    [root@mha1 script]# 
    [root@mha1 script]# ps -ef | grep --color 2493
    root       870  2493  0 11:14 ?        00:00:00 sh /script/shell/do_mha.sh masterha_application_1
    root       888 12118  0 11:14 pts/0    00:00:00 grep --color 2493
    root      2493     1  0 Feb13 ?        03:17:34 sh call_do_mha.sh masterha_application_1
    [root@mha1 script]# 
    [root@mha1 script]# ps -ef | grep --color 543
    root       543     1  0 Feb25 ?        00:07:39 perl /usr/bin/masterha_manager --conf=/etc/masterha_application_2_149_174.cnf --ignore_last_failover
    root       974 12118  0 11:15 pts/0    00:00:00 grep --color 543
    [root@mha1 script]#

    可以看到,确实是被进程占用了。

    【lsof】:
    COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
    1、COMMAND
    默认以9个字符长度显示的命令名称。可使用+c參数指定显示的宽度,若+c后跟的參数为零,则显示命令的全名
    2、PID:进程的ID号
    3、PPID
    父进程的IP号,默认不显示,当使用-R參数可打开。
    4、PGID
    进程组的ID编号,默认也不会显示,当使用-g參数时可打开。
    5、USER
    命令的执行UID或系统中登陆的username称。默认显示为username,当使用-l參数时,可显示UID。
    6、FD
    文件的File Descriptor number,或者例如以下的内容:
    7、TYPE
    引用
    IPv4 IPv4的包;
    IPv6 使用IPv6格式的包,即使地址是IPv4的,也会显示为IPv6,而映射到IPv6的地址;
    DIR 文件夹
    LINK 链接文件
    8、DEVICE
    使用character special、block special表示的设备号
    9、SIZE
    文件的大小,假设不能用大小表示的,会留空。使用-s參数控制。
    10、NODE
    本地文件的node码,或者协议,如TCP等
    11、NAME
    挂载点和文件的全路径(链接会被解析为实际路径),或者连接两方的地址和端口、状态等

    解决:
    杀掉占用的进程:

    [root@mha1 shell]# lsof | grep --color "(deleted)" | grep "/script/shell/nohup.out"
    perl        543      root    1w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    perl        543      root    2w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh         2493      root    1w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh         2493      root    2w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh        31368      root    1w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    sh        31368      root    2w      REG              253,0 15407460352    2093062 /script/shell/nohup.out (deleted)
    [root@mha1 shell]# 
    [root@mha1 shell]# kill -9 31368
    [root@mha1 shell]# kill -9 2493
    [root@mha1 shell]# kill -9 543
    [root@mha1 shell]# 
    [root@mha1 shell]# lsof | grep --color "(deleted)" | grep "/script/shell/nohup.out"
    [root@mha1 shell]#

    再次查看文件系统占用:

    [root@mha1 shell]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/vg_mha1-lv_root
                           42G   27G   13G  69% /
    tmpfs                 7.9G   88K  7.9G   1% /dev/shm
    /dev/sda1             485M   37M  423M   8% /boot
    [root@mha1 shell]#

    可以看到,已经释放出来了。
    ——————————
    Done。



沪ICP备19023445号-2号
友情链接