天天看點

Linux 系統監控診斷指令—lsof

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 ,如需轉載請自行聯系原作者

上一篇: 什麼是WMI

繼續閱讀