lsof指令
lsof(list open files)是一個列出目前系統打開檔案的工具。系統在背景為應用程式配置設定了獨立的檔案
描述符,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用接口,描述符提供了大量關于
這個應用程式本身的資訊,通過lsof指令能夠檢視這個清單,常常用于對系統監測診斷排錯
[root@localhost~]# lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 6,1 5069 2 /
init 1 root rtd DIR 6,1 5069 2 /
init 1 root txt REG 6,1 1235602 54127 /sbin/init
udevd 235 root 0u CHR 1,5 0t0 6862 /dev/null
udevd 235 root 1u CHR 1,5 0t0 6862 /dev/null
udevd 235 root 2u CHR 1,5 0t0 6862 /dev/null
COMMAND:程序的名稱
PID:程序辨別符
USER:程序所有者
FD:檔案描述符,應用程式通過檔案描述符識别該檔案
TYPE:檔案類型,如DIR、REG等
DEVICE:指定磁盤的名稱
SIZE:檔案的大小
NODE:索引節點(檔案在磁盤上的辨別)
NAME:打開檔案的确切名稱
常用參數
常用的參數清單:
lsof filename 顯示打開指定檔案的所有程序
lsof -a 表示多條件查詢都滿足時才顯示結果
lsof -c string 顯示COMMAND列中包含指定字元的程序所有打開的檔案
lsof -u username 顯示所屬user程序打開的檔案
lsof -g gid 顯示歸屬gid的程序情況
lsof +d /DIR/ 顯示目錄下被程序打開的檔案
lsof -d FD 顯示指定檔案描述符的程序
lsof -n 不将IP轉換為hostname,預設是不加上-n參數
lsof -i 用以顯示符合條件的程序情況
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4位址
service --> /etc/service中的 service name (可以多個)
port --> 端口号 (可以多個)
應用執行個體
lsof `which httpd` 那個程序在使用httpd的可執行檔案
lsof /etc/passwd 那個程序在占用/etc/passwd
lsof /dev/sdb2 那個程序在占用sdb2
lsof /dev/cdrom 那個程序在占用光驅
lsof -c sendmail 檢視sendmail程序的檔案使用情況
lsof -c courier -u ^root 顯示出那些檔案被以courier打頭的程序打開,但是并不屬于使用者root
lsof -p 30297 顯示那些檔案被pid為30297的程序打開
lsof -utom 檢視使用者tom的程序的檔案使用情況
lsof -i 顯示所有打開的端口
lsof -i:80 顯示所有打開80端口的程序
用lsof查找恢複被誤删的檔案
當某個檔案被意外地删除了,隻要系統中還有程序正在通路該檔案,就可以通過lsof從/proc目錄下恢複該檔案的内容
假如将/var/logs/messages檔案誤删了,檔案恢複的方法如下:
首先使用lsof來檢視目前是否有程序打開/var/logs/messages檔案
[root@localhost~]# lsof |grep /var/logs/messages
syslogd 1693 root 3w REG 3,3 5896712 1283685 /var/logs/messages (deleted)
從上面的資訊可以看到 PID 1693(syslogd)打開檔案的檔案描述符為3,找到/var/logs/messages已經
标記被删除了。是以我們可以在 /proc/1693/fd/3 (fd下的每個以數字命名的檔案表示程序對應的檔案
描述符)中檢視相應的資訊
[root@localhost~]# head -n 10 /proc/1693/fd/3
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
......
用指令恢複資料 cat /proc/1693/fd/3 > /var/logs/messages
删除資料後,磁盤空間未釋放問題
當要删除一個檔案,執行rm -rf /var/logs/messages 後,磁盤空間未釋放
首先檢視檔案程序是否還存在
[root@localhost~]# lsof |grep /var/logs/messages
syslogd 1693 root 3w REG 3,3 5896712 1283685 /var/logs/messages (deleted)
從上面的資訊可以看到 PID 1693(syslogd)打開檔案的檔案描述符為3,/var/logs/messages已經标記被删除了,但在/proc/1693/fd/3 中檢視所有資訊依舊存在
可以使用指令清空這個檔案
echo "" > /proc/1693/fd/3 或者 rm -rf /proc/1693/fd/3
清空後,磁盤空間立刻釋放
本文轉自super李導51CTO部落格,原文連結:http://blog.51cto.com/superleedo/1887687 ,如需轉載請自行聯系原作者