為什麼刪除檔案後磁碟空間還是不變 解決方案 首先我們獲得一個已經被刪除但是仍然被應用程式佔用的檔案清單:用root使用者;#lsof|grep deletedora    25575 data   33u      REG              65,65  4294983680   31014933 /oradata/DATAPRE/UNDOTBS009.dbf (deleted)從lsof的輸出中,我們可以發現pid為25575的進程持有著以檔案描述號(fd)為33開啟的檔案/oradata/DATAPRE/UNDOTBS009.dbf。在我們找到了這個檔案之後可以通過結束進程的方式來釋放被佔用的空間。#kill -9  25575或者#cd /root/.Trash/#rm -rif *  linux刪除檔案後沒有釋放空間今天發現一台伺服器的home空間滿了,於是要清空無用的檔案,當我刪除檔案後,發現可用空間沒有變化os:centos4.7 現象:發現當前磁碟空間使用方式:[root@ticketb ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 981M 203M 729M 22% /none 16G 0 16G 0% /dev/shm/dev/sda9 2.9G 37M 2.7G 2% /tmp/dev/sda7 4.9G 1.9G 2.7G 42% /usr/dev/sda8 2.9G 145M 2.6G 6% /var/dev/mapper/vghome-lvhome20G 19G 11M 100% /home/dev/mapper/vgoradata-lvoradata144G 48G 90G 35% /u01/oradata/dev/mapper/vgbackup-lvbackup193G 7.8G 175G 5% /u01/backup 通過下面的命令找到無用的檔案,然後刪除 [root@ticketb ~]# find /home/oracle/admin/dbticb/udump/ -name "dbticb_*.trc" -mtime +50 | xargs rm -rf然後在查看磁碟空間使用方式,發現沒有/home空間沒有變化[root@ticketb ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 981M 203M 729M 22% /none 16G 0 16G 0% /dev/shm/dev/sda9 2.9G 37M 2.7G 2% /tmp/dev/sda7 4.9G 1.9G 2.7G 42% /usr/dev/sda8 2.9G 145M 2.6G 6% /var/dev/mapper/vghome-lvhome20G 19G 11M 100% /home/dev/mapper/vgoradata-lvoradata144G 48G 90G 35% /u01/oradata/dev/mapper/vgbackup-lvbackup193G 7.8G 175G 5% /u01/backup這個鬱悶啊,明明刪除檔案了,怎麼空間沒有被釋放啊,rm命令應該是直接刪除啊,在查看下/home下還有什麼佔用空間[root@ticketb ~]# du -h --max-depth=1 /home16K /home/lost+found2.6G /home/oracle2.6G /home可這裡顯示空間已經釋放了啊,於是google下,未釋放磁碟空間原因:在Linux或者Unix系統中,通過rm或者檔案管理工具刪除檔案將會從檔案系統的目錄結構上解除連結(unlink).然而如果檔案是被開啟的(有一個進程正在使用),那麼進程將仍然可以讀取該檔案,磁碟空間也一直被佔用。而我刪除的是oracle的警示log檔案刪除的時候檔案應該正在被使用解決方案首先獲得一個已經被刪除但是仍然被應用程式佔用的檔案清單,如下所示: [root@ticketb ~]# lsof |grep deletedoracle 12639 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc (deleted)oracle 12639 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log (deleted)oracle 12639 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb (deleted)oracle 12639 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log (deleted)oracle 12641 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc (deleted)oracle 12641 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log (deleted)。。。oracle 23492 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log (deleted)oracle 23492 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb (deleted)oracle 23492 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bdump/alert_dbticb.log (deleted)oracle 23494 oracle 10u REG 253,0 0 36307 /home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstrmandb (deleted) 從輸出結果可以看到/home/oracle/admin/dbticb/bdump/alert_dbticb.log還被使用,未被釋放空間如何讓進程釋放呢?一種方法是kill掉相應的進程,或者停掉使用這個檔案的應用,讓os自動回收磁碟空間我這個環境有很多進程在使用的這個檔案,停掉進程有點麻煩,再有就是風險很大當linux開啟一個檔案的時候,Linux核心會為每一個進程在/proc/ 『/proc/nnnn/fd/目錄(nnnn為pid)』建立一個以其pid為名的目錄用來儲存進程的相關資訊,而其子目錄fd儲存的是該進程開啟的所有檔案的fd(fd:file descriptor)。kill進程是通過截斷proc檔案系統中的檔案可以強制要求系統回收分配給正在使用的的檔案。這是一項進階技術,僅到管理員確定不會對運行中的進程造成影響時使用。應用程式對這種方式支援的並不好,當一個正在使用的檔案被截斷可能會引發不可預知的問題 例如,根據之前lsof的輸出:1.$ file /proc/25575/fd/332./proc/25575/fd/33: broken symbolic link to `/oradata/DATAPRE/UNDOTBS009.dbf (deleted)'3.$ echo > /proc/25575/fd/33 所以我還是採用停應用來解決restart oracle資料庫,發現/home/oracle/admin/dbticb/bdump/alert_dbticb.log對應的空間被釋放在查看磁碟空間的使用方式,發現空間已經回收了 [root@ticketb ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 981M 203M 729M 22% /none 16G 0 16G 0% /dev/shm/dev/sda9 2.9G 37M 2.7G 2% /tmp/dev/sda7 4.9G 1.9G 2.7G 42% /usr/dev/sda8 2.9G 145M 2.6G 6% /var/dev/mapper/vghome-lvhome20G 2.6G 16G 15% /home/dev/mapper/vgoradata-lvoradata144G 48G 90G 35% /u01/oradata/dev/mapper/vgbackup-lvbackup193G 7.8G 175G 5% /u01/backup