Linux 不殺進程的情況下,如何釋放磁盤資源



最近項目組人員反饋一個問題:即磁盤空間滿了,但是並沒看到有什么文件占用空間:

[root@xxxx home]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             40G  6.4G   31G  18% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/xvda1            190M   46M  135M  26% /boot
/dev/xvda3             40G   39G   0G  100% /home
/dev/xvda5             40G   49M   38G   1% /tmp
[root@xxxx home]# pwd
/home
[root@xxxx home]# du -sh
5.4G    .
[root@IHSwaiwang7 home]# ls -a
.  ..  appuser  ftp_dir  linux  lost+found

  

為什么磁盤空間大小顯示不准確呢?
有隱藏文件?還是其他原因?
du -sh 命令統計了整體的空間使用率,隱藏文件也能被統計進去。
ls -lah 也沒看到有問題的文件

然后想到是不是有些文件被刪除,但是資源並未釋放呢?
在Linux或者Unix系統中,通過rm或者文件管理器刪除文件將會從文件系統的目錄結構上解除鏈接(unlink).然而如果文件是被
打開的(有一個進程正在使用),那么進程將仍然可以讀取該文件,磁盤空間也一直被占用。

查看被打開的已刪除文件:

[root@xxxx home]# lsof -n | grep deleted
java 27319 root 1w REG 202,3 25981280125 790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java 27319 root 2w REG 202,3 25981280125 790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java 27319 root 8w REG 202,3 1224 790864 /home/appuser/tomcat7-MIR-20012/logs/localhost.2017-10-23.log (deleted)
java 27319 root 42w REG 202,3 273 789028 /home/appuser/tomcat7-MIR-20012/logs/localhost_access_log.2018-03-14.txt (deleted)
java 39917 root 8w REG 202,3 1221 790840 /home/appuser/tomcat7-IMR-20010/logs/localhost.2017-10-18.log (deleted)
java 55250 root 7w REG 202,3 19906 790794 /home/appuser/tomcat7-MIR-20012/logs/catalina.2018-02-03.log (deleted)
java 55250 root 8w REG 202,3 1837 790795 /home/appuser/tomcat7-MIR-20012/logs/localhost.2018-02-03.log (deleted)
java 55516 root 1w REG 202,3 12643031059 788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
java 55516 root 2w REG 202,3 12643031059 788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)

果然存在未釋放資源。一個占用了25981280125 大約24G,一個占用了 12643031059 大約12G,這不就是占滿了嘛!而且都是catalina.out 日志文件

驗證該文件是否存在:

[root@xxxx ~]# ll /home/appuser/tomcat7-MIR-20012/logs/catalina.out
-rw-r--r-- 1 root root 1 4月 52124 12:48 /home/appuser/tomcat7-MIR-20012/logs/catalina.out

文件居然存在的,但是沒那么大啊。

再看其他文件:

[root@xxxx ~]# ll /home/appuser/tomcat7-SI-20011/logs/catalina.out
ls: 無法訪問/home/appuser/tomcat7-SI-20011/logs/catalina.out: 沒有那個文件或目錄

這個文件倒是真的不存在。

那么能通過創建文件的方式解決嗎?

[root@xxxx ~]# > /home/appuser/tomcat7-SI-20011/logs/catalina.out
[root@xxxx ~]# ll /home/appuser/tomcat7-SI-20011/logs/catalina.out
-rw-r--r-- 1 root root 0 4月 19 13:30 /home/appuser/tomcat7-SI-20011/logs/catalina.out
[root@xxxx ~]# lsof -n | grep deleted
java 27319 root 1w REG 202,3 25981280125 790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java 27319 root 2w REG 202,3 25981280125 790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java 27319 root 8w REG 202,3 1224 790864 /home/appuser/tomcat7-MIR-20012/logs/localhost.2017-10-23.log (deleted)
java 27319 root 42w REG 202,3 273 789028 /home/appuser/tomcat7-MIR-20012/logs/localhost_access_log.2018-03-14.txt (deleted)
java 39917 root 8w REG 202,3 1221 790840 /home/appuser/tomcat7-IMR-20010/logs/localhost.2017-10-18.log (deleted)
java 55250 root 7w REG 202,3 19906 790794 /home/appuser/tomcat7-MIR-20012/logs/catalina.2018-02-03.log (deleted)
java 55250 root 8w REG 202,3 1837 790795 /home/appuser/tomcat7-MIR-20012/logs/localhost.2018-02-03.log (deleted)
java 55516 root 1w REG 202,3 12643031059 788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
java 55516 root 2w REG 202,3 12643031059 788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted))

創建文件並不能釋放資源。

清空文件呢?

[root@xxxx ~]# > /home/appuser/tomcat7-MIR-20012/logs/catalina.out
[root@xxxx ~]# ll /home/appuser/tomcat7-MIR-20012/logs/catalina.out
-rw-r--r-- 1 root root 0 4月 19 13:32 /home/appuser/tomcat7-MIR-20012/logs/catalina.out
[root@xxxx ~]# lsof -n | grep deleted
java 27319 root 1w REG 202,3 25981280125 790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java 27319 root 2w REG 202,3 25981280125 790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java 27319 root 8w REG 202,3 1224 790864 /home/appuser/tomcat7-MIR-20012/logs/localhost.2017-10-23.log (deleted)
java 27319 root 42w REG 202,3 273 789028 /home/appuser/tomcat7-MIR-20012/logs/localhost_access_log.2018-03-14.txt (deleted)
java 39917 root 8w REG 202,3 1221 790840 /home/appuser/tomcat7-IMR-20010/logs/localhost.2017-10-18.log (deleted)
java 55250 root 7w REG 202,3 19906 790794 /home/appuser/tomcat7-MIR-20012/logs/catalina.2018-02-03.log (deleted)
java 55250 root 8w REG 202,3 1837 790795 /home/appuser/tomcat7-MIR-20012/logs/localhost.2018-02-03.log (deleted)
java 55516 root 1w REG 202,3 12643031059 788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
java 55516 root 2w REG 202,3 12643031059 788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted))

清空文件也不能釋放資源。

正常來說直接把進程殺了,資源立刻就能被釋放。但是這是生產環境,問了開發人員進程不能殺,那怎么辦呢?
最徹底的方法當然就是重啟進程,殺進程或重啟服務器。但是不能殺的情況下,怎么釋放資源呢?

當linux打開一個文件的時候,Linux內核會為每一個進程在/proc 目錄下創建建立一個以其pid
為名的目錄用來保存進程的相關信息,而其子目錄fd保存的是該進程打開的所有文件的fd(fd:file descriptor)。
目錄格式類似/proc/27319/fd

那么我們進到目錄下,看有哪些文件被占用:

[root@xxxx fd]# cd /proc/27319/fd
[root@xxxx fd]# ls
0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 47 49 50 7 82 84 9
1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 46 48 5 6 8 83 86
[root@xxxx fd]# ll | grep deleted
l-wx------ 1 root root 64 4月 19 12:25 1 -> /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
l-wx------ 1 root root 64 4月 19 12:25 2 -> /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
l-wx------ 1 root root 64 4月 19 12:25 42 -> /home/appuser/tomcat7-MIR-20012/logs/localhost_access_log.2018-03-14.txt (deleted)
l-wx------ 1 root root 64 4月 19 12:25 8 -> /home/appuser/tomcat7-MIR-20012/logs/localhost.2017-10-23.log (deleted)

果然文件都是以鏈接的形式存在的,那么我們查看文件

/home/appuser/tomcat7-MIR-20012/logs/catalina.out
就相當於讀取的這里的文件 1 

文件1能直接查看嗎?

[root@xxxx fd]# more 1
2016-04-19 12:55:01 [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能組:3600上沒有空閑的坐席!
2016-04-19 12:55:02 [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 開始分配任務,隊列:3600 任務數:1 空閑坐席:0
[root@xxxx fd]# tail 1
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 開始分配任務,隊列:365 任務數:3 空閑坐席:0
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.rule.allocation.impl.AbstractAllocationRule]-[INFO] 獲取租戶514000技能隊列3600上簽入的坐席數據!
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能組:3600上沒有空閑的坐席!
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 開始分配任務,隊列:3600 任務數:1 空閑坐席:0
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.rule.allocation.impl.AbstractAllocationRule]-[INFO] 獲取租戶514000技能隊列3650上簽入的坐席數據!
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能組:3650上沒有空閑的坐席!
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 開始分配任務,隊列:3650 任務數:1 空閑坐席:0
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.rule.allocation.impl.AbstractAllocationRule]-[INFO] 獲取租戶514000技能隊列3490上簽入的坐席數據!
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能組:3490上沒有空閑的坐席!
2018-04-19 14:09:14 [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 開始分配任務,隊列:3490 任務數:1 空閑坐席:0

 

果然能直接查看,而且保留了2016年的日志,怪不得這么大。而且仍在往里面寫日志。
再檢查我們剛才創建的文件,日志並沒寫進去。

既然如此,那我們把這個日志文件清理了,空間時不時就降下來了?

[root@xxxx fd]# > 1
[root@xxxx 55516]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             40G  6.4G   31G  18% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/xvda1            190M   46M  135M  26% /boot
/dev/xvda3             40G   15G   23G  39% /home
/dev/xvda5             40G   49M   38G   1% /tmp

 


空間順利釋放,同樣辦法我們把另一個日志也清理掉。

java       55516      root    1w      REG              202,3 12643031059     788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)

[root@xxxx 55516]# cd /proc/55516/fd
[root@xxxx fd]# ls -l | grep deleted
l-wx------ 1 root root 64 4月  19 12:25 1 -> /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
l-wx------ 1 root root 64 4月  19 12:25 2 -> /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
[root@xxxx fd]# > 1
[root@xxxx fd]# lsof -n | grep deleted
java       27319      root    1w      REG              202,3  7100981     790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java       27319      root    2w      REG              202,3  7100981     790834 /home/appuser/tomcat7-MIR-20012/logs/catalina.out (deleted)
java       27319      root    8w      REG              202,3     1224     790864 /home/appuser/tomcat7-MIR-20012/logs/localhost.2017-10-23.log (deleted)
java       27319      root   42w      REG              202,3      273     789028 /home/appuser/tomcat7-MIR-20012/logs/localhost_access_log.2018-03-14.txt (deleted)
java       39917      root    8w      REG              202,3     1221     790840 /home/appuser/tomcat7-IMR-20010/logs/localhost.2017-10-18.log (deleted)
java       55250      root    7w      REG              202,3    19906     790794 /home/appuser/tomcat7-MIR-20012/logs/catalina.2018-02-03.log (deleted)
java       55250      root    8w      REG              202,3     1837     790795 /home/appuser/tomcat7-MIR-20012/logs/localhost.2018-02-03.log (deleted)
java       55516      root    1w      REG              202,3     2480     788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
java       55516      root    2w      REG              202,3     2480     788725 /home/appuser/tomcat7-SI-20011/logs/catalina.out (deleted)
[root@xxxx fd]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda2             40G  6.4G   31G  18% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/xvda1            190M   46M  135M  26% /boot
/dev/xvda3             40G  2.5G   35G   7% /home
/dev/xvda5             40G   49M   38G   1% /tmp

完成!

 

通過以上方法,在不殺進程的情況下,順利釋放了磁盤空間。但這只是一個臨時的處理方式。
該文件不釋放仍會持續增長下去。
仍然需要項目組預約一個維護窗口,把所有進程都殺掉,徹底釋放資源才算徹底解決。

 

 參考:

https://www.cnblogs.com/xxdfly/p/6564294.html

https://blog.csdn.net/wyzxg/article/details/4971843

 

 


免責聲明!

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



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