一、Linux服務(wù)器上文件已刪除但空間沒(méi)有釋放原因說(shuō)明 1、問(wèn)題說(shuō)明
查看某臺(tái)centos6.7日志服務(wù)器發(fā)現(xiàn)磁盤(pán)空間已經(jīng)達(dá)到100%,刪除存放日志路徑下的文件后,發(fā)現(xiàn)空間并未釋放。
2、問(wèn)題分析
在linux或者Unix系統(tǒng)中,通過(guò)rm或者文件管理器刪除文件將會(huì)從文件系統(tǒng)的文件夾結(jié)構(gòu)上解除鏈接(unlink).然而假設(shè)文件是被打開(kāi)的(有一個(gè)進(jìn)程正在使用),那么進(jìn)程將仍然能夠讀取該文件,磁盤(pán)空間也一直被占用。
通過(guò)命令lsof查看是否有已刪除文件占用空間(lsof +L1或lsof | grep delete)。
從上圖可以看出有大量庫(kù)表文件被刪除但仍然在數(shù)據(jù)庫(kù)中運(yùn)行占用空間,所以導(dǎo)致出現(xiàn)rm刪除文件但磁盤(pán)空間未得到釋放的情況,SIZE列為文件占用的空間大小。
3、解決方法
根據(jù)上圖可以看出啊占用已刪除文件的進(jìn)程是數(shù)據(jù)庫(kù),可以重啟數(shù)據(jù)庫(kù)MySQL來(lái)釋放進(jìn)程,也可以重啟服務(wù)器。
如遇到Apache、Tomcat、Nginx 等 Web 服務(wù)產(chǎn)生的日志文件,無(wú)法在生產(chǎn)環(huán)境上重啟,可以選擇在線(xiàn)清空日志的方法echo " " >路徑+日志名
二、lsof命令解析
lsof全名list opened files,也就是列舉系統(tǒng)中已經(jīng)被打開(kāi)的文件。在linux環(huán)境中,都是以文件形式存放的,設(shè)備是文件,文件夾是文件,甚至sockets也是文件。所以,用好lsof命令,它可以顯示系統(tǒng)中所有打開(kāi)的文件,包括網(wǎng)絡(luò)連接、管道、設(shè)備、目錄和普通文件等,對(duì)日常的linux管理非常有幫助。
基礎(chǔ)命令格式:lsof [options] [names]
1、命令輸出字段解析
lsof是linux最常使用的命令之中的一個(gè),通常的輸出格式為:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
常見(jiàn)包含例如以下幾個(gè)字段:
文件描述符FD解析:
cwd current working ;
Lnn library (AIX);
jld jail (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent ;
rtd root ;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
文件的File number顯示模式有:
r for read access;
w for write access;
u for read and write access;
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO Xenix lock on part of the file;
X for an SCO Xenix lock on the entire file;
space if there is no lock.
2、常用的lsof命令選項(xiàng)
下面是一些常用的lsof命令選項(xiàng):
-a:表示邏輯與,用于指定多個(gè)過(guò)濾條件之間的關(guān)系;
-b:不重新讀取已打開(kāi)文件的信息,防止系統(tǒng)阻塞;
-c:表示按進(jìn)程名過(guò)濾;
-d:表示按文件描述符過(guò)濾;
-D :搜索某個(gè)目錄下被打開(kāi)的文件
-g:表示按組ID過(guò)濾;
-i:表示按網(wǎng)絡(luò)連接過(guò)濾;
-p:表示按進(jìn)程ID過(guò)濾;
-u:表示按用戶(hù)ID過(guò)濾;
-t:表示只輸出進(jìn)程ID;
-F:表示指定輸出格式;
-h:表示不顯示列名;
-n:表示不解析主機(jī)名;
-P:表示不解析端口號(hào);
-r:表示指定輸出間隔時(shí)間;
-s:表示按文件大小過(guò)濾;
-T:表示指定輸出格式。
3、lsof常見(jiàn)用法舉例
要列出所有打開(kāi)的文件,可以使用以下命令:
lsof
要列出指定進(jìn)程打開(kāi)的文件,可以使用以下命令:
lsof -p <指定進(jìn)程pid>
要列出指定用戶(hù)打開(kāi)的文件,可以使用以下命令:
lsof -u
要列出指定文件名的進(jìn)程,可以使用以下命令:
lsof
要列出指定端口號(hào)的進(jìn)程,可以使用以下命令:
lsof -i :
要列出指定目錄下打開(kāi)的文件,可以使用以下命令:
lsof
要列出刪除但磁盤(pán)空間未釋放的文件,可以使用以下命令:
lsof | grep delete
lsof +L1
要列出某個(gè)進(jìn)程打開(kāi)的文件,可以使用以下命令:
lsof -c 進(jìn)程名
要列出按照文件夾/home/oracle來(lái)搜尋,但不會(huì)打開(kāi)子文件夾,用來(lái)顯示文件夾下被進(jìn)程開(kāi)啟的文件,可以使用以下命令:
lsof +d /home/oracle
COMMAND? PID?? USER?? FD?? TYPE DEVICE SIZE???? NODE NAME
tnslsnr 3520 oracle? cwd??? DIR? 253,5 4096 11059201 /home/oracle
要列出打開(kāi)/home/oracle文件夾以及其子文件夾搜尋,用來(lái)顯示文件夾下被進(jìn)程開(kāi)啟的文件,可以使用以下命令:
lsof +D /home/oracle
除了以上常用的選項(xiàng)外,lsof還支持很多其他的選項(xiàng),可以通過(guò)man lsof命令查看完整的幫助文檔。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。