(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的程序的資訊。