Linux系統下rm刪除文件后空間沒有釋放問題解決辦法


一、問題描述

今日收到zabbix監控報警,發現生產環境一台服務器的磁盤空間不足,需要進行處理,登錄后發現可利用率不足20%,進行相關查看和處理工作;但是操作刪除了一些備份文件和日志信息后,查看空間仍然不足。

二、具體操作過程

1、檢查服務器占用硬盤資源的文件

[root@nc-ftp02 ~]# df -hP
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda2       99G  4.2G   90G   5% /
tmpfs           3.9G  228K  3.9G   1% /dev/shm
/dev/xvda1      380M   66M  294M  19% /boot
/dev/xvda5      386G  290G   77G  80% /data
[root@nc-ftp02 ~]# cd /data/
[root@nc-ftp02 data]# ls
backup   data_bak  ftp  lost+found    script
[root@nc-ftp02 data]# du -sh *
4.1G	backup
12G	data_bak
813M	ftp
16K	lost+found
5.0G	nchome
16K	script 

注意:查看后,發現data目錄下,並無大文件存在,備份目錄下面只保留了2個月的數據,所以問題依舊存在。

這時想起來,在Linux或者Unix系統中,通過rm或者文件管理器刪除文件將會從文件系統的文件夾結構上解除鏈接(unlink).然而假設文件是被打開的(有一個進程正在使用),那么進程將仍然能夠讀取該文件,磁盤空間也一直被占用。而我刪除的是備份和log文件刪除的時候文件應該正在被使用;

2、查看刪除文件被占用的具體情況

[root@nc-ftp02 data]# lsof -n /data |grep deleted   
sh         8757 root    1w   REG  202,5 287246420690       12 /data/nohup.out (deleted)
sh         8757 root    2w   REG  202,5 287246420690       12 /data/nohup.out (deleted)
rsync     28485 root    1w   REG  202,5 287246420690       12 /data/nohup.out (deleted)
rsync     28485 root    2w   REG  202,5 287246420690       12 /data/nohup.out (deleted)
ssh       28486 root    2w   REG  202,5 287246420690       12 /data/nohup.out (deleted)
ssh       28486 root    6w   REG  202,5 287246420690       12 /data/nohup.out (deleted)
[root@nc-ftp02 data]# lsof -n /data |grep deleted|awk '{print $2}'
8757
8757
28674
28674
28675
28675
[root@nc-ftp02 data]# lsof -n /data |grep deleted|awk '{print $2}'|xargs kill -9
[root@nc-ftp02 data]# lsof -n /data |grep deleted
[root@nc-ftp02 data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda2       99G  4.2G   90G   5% /
tmpfs           3.9G  228K  3.9G   1% /dev/shm
/dev/xvda1      380M   66M  294M  19% /boot
/dev/xvda5      386G   22G  345G   6% /data

3、如何讓進程釋放?

一種方法是kill掉相應的進程,另一種就是停掉使用這個文件的應用,讓os自己主動回收磁盤空間。

3.1、如果系統管理員能夠熟悉該服務器上相關應用部署和配置,可以通過第一種方法進行釋放,我在操作過程,采用的就是kill掉應用中不使用的進程來釋放空間;

當linux打開一個文件的時候,Linux內核會為每個進程在/proc/ 『/proc/nnnn/fd/文件夾(nnnn為pid)』建立一個以其pid
為名的文件夾用來保存進程的相關信息,而其子文件夾fd保存的是該進程打開的全部文件的fd(fd:file descriptor)。

kill進程是通過截斷proc文件系統中的文件能夠強制要求系統回收分配給正在使用的的文件。
僅到管理員確定不會對執行中的進程造成影響時使用。應用程序對這樣的方
式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題

3.2、如果環境有非常多進程在使用的這個文件,停掉進程可能帶來一定風險,又不在系統管理員控制范圍內,建議不要輕易使用kill進行操作;最好原則合適時間停掉相關應用進行釋放。
綜上所述,問題解決!

---------------------------------------------書山有路勤為徑,學海無涯苦作舟--------------------------------------------------------  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM