linux lsof命令

1、lsof命令簡介

lsof是list open files的簡稱,它的作用主要是列出系統中打開的文件,基本上linux系統中所有的對象都可以看作文件,lsof可以查看用戶和進程操作了哪些文件,也可以查看系統中網絡的使用情況,以及設備的信息。

在終端下輸入lsof命令即可顯示系統打開的文件,它訪問核心內存和各種文件,需要root用戶身份才能發揮其功能。

# lsof
COMMAND    PID  TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1         root  cwd       DIR                8,2      4096          2 /
systemd      1         root  rtd       DIR                8,2      4096          2 /
systemd      1         root  txt       REG                8,2   1612152    2893576 /usr/lib/systemd/systemd
systemd      1         root  mem       REG                8,2     20112    2888194 /usr/lib64/libuuid.so.1.3.0
systemd      1         root  mem       REG                8,2    261456    2888419 /usr/lib64/libblkid.so.1.1.0
systemd      1         root  mem       REG                8,2     90664    2887685 /usr/lib64/libz.so.1.2.7
systemd      1         root  mem       REG                8,2    157424    2888172 /usr/lib64/liblzma.so.5.2.2
......

直接運行lsof,會列出系統中所有打開的文件,每個文件一行,其中每列信息的含有如下:

COMMAND:進程名稱

PID:進程ID

USER:進程運行的用戶名

FD:表示文件描述符,如:cwd當前工作目錄,mem內存映射文件,mmap內存映射設備,txt應用文本(代碼和數據),其次數值表示應用程序的文件描述符,這是打開文件時返回的一個整數,u表示該文件處於讀取和寫入模式,®爲只讀,(w)爲只寫模式,大寫W爲對整個文件的寫鎖權限,初始打開一個應用程序時有具有三個文件描述符,從0到2分別表示標準輸入,輸出和錯誤輸出,所以大多數應用程序打開的文件的PD都是從3開始的

TYPE:表示文件的類型,如,REG普通文件,DIR目錄,CHR字符文件,BLK設備文件,UNIX爲Unix套接字,FIFO先進先出隊列,IPv4網際協議IP套接字

DEVICE:文件所在的設備

SIZE:文件的大小

NODE:索引節點,文件在磁盤的標識符

NAME:打開文件的名稱

2、lsof查看文件和進程

lsof常用嘗試列表:

lsof  filename 顯示打開指定文件的所有進程

lsof -a 表示兩個參數都必須滿足時才顯示結果

lsof -c string   顯示COMMAND列中包含指定字符的進程所有打開的文件

lsof -u username  顯示所屬user進程打開的文件

lsof -g gid 顯示歸屬gid的進程情況

lsof +d /DIR/ 顯示目錄下被進程打開的文件

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 --> 端口號 (可以不只一個)


1)列出某個進程打開的所有文件

lsof -p 1149

2)列出某個用戶打開的文件

lsof -u root

3)列出所有不是某個用戶打開的文件,也就是取反,在用戶名前添加^符號

lsof -u ^root

4)列出某個文件被哪些進程打開使用

lsof /dev/null

5)列出訪問某個目錄的所有進程

lsof +d /dev/

6)遞歸列出訪問某個目錄下所有進程

lsof +D /var/

7)列出某個進程名使用的文件信息

lsof -c dhcpd

3、lsof查看網絡信息

lsof也可以查看網絡信息,如查看某個端口的使用情況

1)列出所有的網絡鏈接信息

lsof -i

2)只列出某個協議類型的網絡鏈接信息

lsof -i TCP

3)查看某個端口的網絡鏈接狀態

lsof -i :67

4)查看鏈接到某個主機的網絡狀態

lsof -i @192.168.146.1

5)查看連接到某個主機的特定端口的網絡狀態

lsof -i @192.168.146.1:80

6)列出當前主機監聽的端口

lsof -i -s TCP:LISTEN

-s P:S參數跟着兩個字段,協議和狀態,中間用冒號隔開,如上表示TCP協議的監聽狀態,也可以查看處於連接的TCP網絡狀態:

lsof -i -s TCP:ESTABLISHED

實用的命令:

lsof `which httpd`    #列出那個進程使用了apache的執行文件
lsof /dev/cdrom      #列出那個進程在使用光驅
lsof -u 1000         #查看UID爲1000的用戶使用的進程
lsof -i TCP@[url]  #查看哪個進程打開了TCP鏈接到主機的80端口 
lsof -i tcp@ -r  #不斷查看目前tfp鏈接的情況

4、通過lsof恢復刪除的文件

通過lsof恢復已刪除的文件,前提條件的是這個文件有程序正在使用,可以通過lsof /path/to/filename能查看到正在使用此文件的程序,下面我們以日誌文件message爲例實驗下:

1)查看使用文件的實用程序

lsof /var/log/messages
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
abrt-watc  671 root    4r   REG    8,2   516027 1311595 /var/log/messages
rsyslogd  1148 root    6w   REG    8,2   516027 1311595 /var/log/messages

2)刪除message文件

rm -rf /var/log/messages

3)通過上面查看的進程ID我們在/proc目錄下找到該進程的文件目錄,然後通過FD,找到FD目錄的文件編號,然後對文件進行恢復

如:上面PID爲1148那我們先找到/proc目錄下進程爲1148的目錄,然後cd到FD目錄下,上面FD顯示文件使用6w打開,表示在6文件中以鎖的方式打開

cd /proc/1148/fd

查看下6文件中的文件內容,是不是和之前刪除的文件一樣呢:

tail -n 10 6

下面開始通過命令恢復:

cat /proc//1148/fd/6 >/var/log/messages


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章