lsof命令簡介
lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後臺都爲該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符爲應用程序與基礎操作系統之間的交互提供了通用接口。因爲應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。
1. 因爲lsof命令需要訪問核心內存和各種文件,所以需要root用戶執行。
2. lsof命令並非系統自帶命令,如果找不到該命令,以Cent OS爲例,執行以下命令進行安裝:
yum install lsof
Linux磁盤空間
有時會出現這樣的情況,磁盤空間顯示已經被佔滿,但是在查看磁盤的具體文件佔用情況時,發現磁盤仍然有很大的空餘空間。重啓系統後,剩餘的磁盤空間纔會顯示出來。
1. 執行df命令查看磁盤使用情況,發現磁盤已經滿了。
-bash-4.2$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 30G 30G 0 100% /
devtmpfs devtmpfs 489M 0 489M 0% /dev
tmpfs tmpfs 497M 0 497M 0% /dev/shm
tmpfs tmpfs 497M 50M 447M 11% /run
tmpfs tmpfs 497M 0 497M 0% /sys/fs/cgroup
2. 執行du命令查看各個目錄的磁盤佔用情況,把各個目錄文件的大小相加,發現並沒有佔滿磁盤,有10多G空間莫名失蹤。
-bash-4.2$ du -h --max-depth=1 /home
146M /home/dancen
16M /home/logs
11G /home/serverdog
11G /home
3. 爲何會出現這樣的情況呢?
這是因爲磁盤上的某些文件已經被刪除,但是一些進程仍然持有這些文件,因此其原來佔用的磁盤空間並沒有被釋放。
執行lsof命令顯示哪些進行佔用了被刪除的文件。將有問題的進程重啓,磁盤空間就會得到釋放。
[root@dancen /]# lsof | grep delete
mysqld 2470 mysql 4u REG 253,1 0 523577 /var/tmp/ibfTeQFn (deleted)
mysqld 2470 mysql 5u REG 253,1 0 523579 /var/tmp/ibaHcIdW (deleted)
mysqld 2470 mysql 6u REG 253,1 0 523581 /var/tmp/ibLjiALu (deleted)
mysqld 2470 mysql 7u REG 253,1 0 523585 /var/tmp/ibCFnzTB (deleted)
mysqld 2470 mysql 11u REG 253,1 0 523587 /var/tmp/ibCjuqva (deleted)