天天看點

【工具】lsof 的使用

(list open files) 是一個列出目前系統打開檔案的工具!

原理:

在linux環境下,任何事物都以檔案的形式存在,系統在背景都為應用程式配置設定了一個對應的檔案描述符,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用接口。是以通過lsof工具能夠檢視應用程式打開檔案的描述符清單,以便檢視應用程式的資訊!

用法以及含義:

losf 的文法:

lsof [options] filename

如果不使用參數的話,預設顯示所有程序打開的所有檔案。

[root@rac3 ~]# lsof | more

COMMAND     PID      USER   FD      TYPE             DEVICE       SIZE       NODE NAME

init          1      root  cwd       DIR                8,3       4096          2 /

init          1      root  rtd       DIR                8,3       4096          2 /

init          1      root  txt       REG                8,3      43496    2450664 /sbin/init

init          1      root  mem       REG                8,3      95464    1764613 /lib64/libselinux.so.1

init          1      root   10u     FIFO               0,17                  1204 /dev/initctl

migration     2      root  cwd       DIR                8,3       4096          2 /

migration     2      root  rtd       DIR                8,3       4096          2 /

migration     2      root  txt   unknown                                          /proc/2/exe

rpc.statd  2567      root    0u      CHR                1,3                  1432 /dev/null

sdpd       2643      root    2u      CHR                1,3                  1432 /dev/null

oracle    10970    oracle   17u     IPv6              21324                       UDP rac3:30005

sdpd       2643      root    4u     sock                0,5                  7350 can t identify protocol

sdpd       2643      root    5u     unix 0xffff81012e52e380                  7358 /var/run/sdp

rpc.statd  2567      root    4w     FIFO                0,6                  7128 pipe

rpc.statd  2567      root    5u     unix 0xffff81013f84cb80                  7131 socket

rpc.statd  2567      root    7u     IPv4               7218                   TCP *:3com-amp3 (LISTEN)

lsof輸出各列資訊的意義如下:

COMMAND:程序的名稱!

PID:    程序辨別符!

USER:   程序所有者!

FD:     檔案描述符,應用程式通過檔案描述符識别該檔案。如cwd、txt等!

TYPE:   檔案類型,如DIR、REG,MEM等!

DEVICE: 指定磁盤的名稱!

SIZE:   檔案的大小!

NODE:   索引節點(檔案在磁盤上的辨別)!

NAME:   打開的檔案名稱 !

FD 列中的檔案描述符意義:

cwd  表示應用程式的目前工作目錄,也是該應用程式啟動的目錄,除非它本身對這個目錄進行更改。

txt  表示該類型的檔案是程式代碼,如應用程式二進制檔案本身或共享庫,如上清單中顯示的/sbin/init程式。

數值 表示應用程式的檔案描述符,打開該檔案時傳回的整數。如上的最後一行檔案/dev/initctl,其檔案描述符為 10;/dev/null的描述符為2!

u    表示該檔案被打開并處于讀取/寫入模式,而不是隻讀(r)或隻寫(w)模式。大寫的W表示該應用程式具有對整個檔案的寫鎖。該檔案描述符用于確定每次隻能打開一個應用程式執行個體!

初始打開每個應用程式時,都具有三個檔案描述符,從0到2,分别表示标準輸入、輸出和錯誤流。是以大多數應用程式所打開的檔案的FD都是從3開始。

Type 列中的檔案描述符意義:

REG  表示檔案

DIR  表示目錄

CHR  表示字元裝置

BLK  表示和塊裝置

UNIX 表示UNIX 域套接字

FIFO 表示先進先出(FIFO)隊列

IPv4 表示網際協定(IP)套接字。

了解了lsof的原理,那losf到底有什麼用呢?下面介紹losf的用處

1 檢視端口的使用 比如1521,檢視有多少機器建立了與目前機器oracle資料庫的連接配接! 

oracle@rac3:/home/oracle>lsof -i :1521 | more

COMMAND   PID   USER   FD   TYPE  DEVICE SIZE NODE NAME

oracle    329 oracle   13u  IPv4 6167257       TCP dba-host1.hz.ali.com:1521->10.250.3.44:44782 (ESTABLISHED)

oracle    331 oracle   15u  IPv4 6167274       TCP dba-host1.hz.ali.com:1521->10.250.3.56:45332 (ESTABLISHED)

oracle    515 oracle   15u  IPv4 6167700       TCP dba-host1.hz.ali.com:1521->10.250.3.47:43180 (ESTABLISHED)

oracle   1436 oracle   15u  IPv4 6169854       TCP dba-host1.hz.ali.com:1521->10.249.196.131:39527 (ESTABLISHED)

oracle   1468 oracle   15u  IPv4 6169968       TCP dba-host1.hz.ali.com:1521->10.250.3.34:52021 (ESTABLISHED)

oracle   1470 oracle   15u  IPv4 6169977       TCP dba-host1.hz.ali.com:1521->10.250.3.34:52022 (ESTABLISHED)

檢視mysql的3306  rac3-->rac4 是一個主從架構

[root@rac3 ~]# lsof -i :3306 

COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME

mysqld  3181 mysql   12u  IPv6   8063       TCP *:mysql (LISTEN)

mysqld  3181 mysql   39u  IPv6   8070       TCP rac3:mysql->rac4:36554 (ESTABLISHED)

2 檢視某個使用者打開的類型mem的檔案:

[root@rac3 ~]#  lsof -a -u oracle -d mem | more

COMMAND   PID   USER  FD   TYPE DEVICE     SIZE    NODE NAME

bash     9625 oracle mem    REG    8,3   139416 1764595 /lib64/ld-2.5.so

bash     9625 oracle mem    REG    8,3  1713160 1764596 /lib64/libc-2.5.so

bash     9625 oracle mem    REG    8,3    23360 1764602 /lib64/libdl-2.5.so

bash     9625 oracle mem    REG    8,3    15584 1764624 /lib64/libtermcap.so.2.0.8

bash     9625 oracle mem    REG    8,3    53880 1764315 /lib64/libnss_files-2.5.so

bash     9625 oracle mem    REG    8,3 56462864 4447583 /usr/lib/locale/locale-archive

bash     9625 oracle mem    REG    8,3    25464 4541667 /usr/lib64/gconv/gconv-modules.cache

oracle  10970 oracle mem    REG   0,20 16777216   21166 /dev/shm/ora_yangdb_98305_0

oracle  10970 oracle mem    REG   0,20        0   21167 /dev/shm/ora_yangdb_98305_1

oracle  10970 oracle mem    REG   0,20        0   21168 /dev/shm/ora_yangdb_98305_2

oracle  10970 oracle mem    REG   0,20        0   21169 /dev/shm/ora_yangdb_98305_3

...省略...

3 檢視那些程式在使用某個檔案:

[root@rac3 ~]# lsof /opt/mysql/data/

COMMAND  PID  USER   FD   TYPE DEVICE SIZE    NODE NAME

mysqld  3181 mysql  cwd    DIR    8,3 4096 2842467 /opt/mysql/data/

4 恢複誤删除的檔案:

os 原理:

    當程序打開了某個檔案時,隻要該程序保持打開該檔案,即使将其删除,它依然存在于磁盤中。這意味着,程序并不知道檔案已經被删除,它仍然可以向打開該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經删除了其相應的目錄索引節點。

    在/proc 目錄下,其中包含了反映核心和程序樹的各種檔案。/proc目錄挂載的是在記憶體中所映射的一塊區域,是以這些檔案和目錄并不存在于磁盤中,是以當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中擷取相關資訊。

    大多數與lsof相關的資訊都存儲于以程序的PID命名的目錄中,即/proc/123中包含的是 PID為123的程序的資訊。