lsof 命令——一切皆檔案
阿新 • • 發佈:2018-12-15
lsof(list open files)是一個檢視當前系統檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。如傳輸控制協議 (TCP) 和使用者資料報協議 (UDP) 套接字等,系統在後臺都為該應用程式分配了一個檔案描述符,該檔案描述符提供了大量關於這個應用程式本身的資訊。
lsof開啟的檔案可以是:
- 普通檔案
- 目錄
- 網路檔案系統的檔案
- 字元或裝置檔案
- (函式)共享庫
- 管道,命名管道
- 符號連結
- 網路檔案(例如:NFS file、網路socket,unix域名socket)
- 還有其它型別的檔案,等等
3.1. 命令引數
- -a 列出開啟檔案存在的程序
- -c<程序名> 列出指定程序所開啟的檔案
- -g 列出GID號程序詳情
- -d<檔案號> 列出佔用該檔案號的程序
- +d<目錄> 列出目錄下被開啟的檔案
- +D<目錄> 遞迴列出目錄下被開啟的檔案
- -n<目錄> 列出使用NFS的檔案
- -i<條件> 列出符合條件的程序。(4、6、協議、:埠、 @ip )
- -p<程序號> 列出指定程序號所開啟的檔案
- -u 列出UID號程序詳情
- -h 顯示幫助資訊
- -v 顯示版本資訊
3.2. 使用例項
例項1:無任何引數
$lsof| more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 1310795 /sbin/init init 1 root mem REG 253,0 65928 5505054 /lib64/libnss_files-2.12.so init 1 root mem REG 253,0 1918016 5521405 /lib64/libc-2.12.so init 1 root mem REG 253,0 93224 5521440 /lib64/libgcc_s-4.4.6-20120305.so.1 init 1 root mem REG 253,0 47064 5521407 /lib64/librt-2.12.so init 1 root mem REG 253,0 145720 5521406 /lib64/libpthread-2.12.so ...
說明:
lsof輸出各列資訊的意義如下:
- COMMAND:程序的名稱
- PID:程序識別符號
- PPID:父程序識別符號(需要指定-R引數)
- USER:程序所有者
- PGID:程序所屬組
- FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等:
(1)cwd:表示current work dirctory,即:應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改 (2)txt :該型別的檔案是程式程式碼,如應用程式二進位制檔案本身或共享庫,如上列表中顯示的 /sbin/init 程式 (3)lnn:library references (AIX); (4)er:FD information error (see NAME column); (5)jld:jail directory (FreeBSD); (6)ltx:shared library text (code and data); (7)mxx :hex memory-mapped type number xx. (8)m86:DOS Merge mapped file; (9)mem:memory-mapped file; (10)mmap:memory-mapped device; (11)pd:parent directory; (12)rtd:root directory; (13)tr:kernel trace file (OpenBSD); (14)v86 VP/ix mapped file; (15)0:表示標準輸入 (16)1:表示標準輸出 (17)2:表示標準錯誤 一般在標準輸出、標準錯誤、標準輸入後還跟著檔案狀態模式:r、w、u等 (1)u:表示該檔案被開啟並處於讀取/寫入模式 (2)r:表示該檔案被開啟並處於只讀模式 (3)w:表示該檔案被開啟並處於 (4)空格:表示該檔案的狀態模式為unknow,且沒有鎖定 (5)-:表示該檔案的狀態模式為unknow,且被鎖定 同時在檔案狀態模式後面,還跟著相關的鎖 (1)N:for a Solaris NFS lock of unknown type; (2)r:for read lock on part of the file; (3)R:for a read lock on the entire file; (4)w:for a write lock on part of the file;(檔案的部分寫鎖) (5)W:for a write lock on the entire file;(整個檔案的寫鎖) (6)u:for a read and write lock of any length; (7)U:for a lock of unknown type; (8)x:for an SCO OpenServer Xenix lock on part of the file; (9)X:for an SCO OpenServer Xenix lock on the entire file; (10)space:if there is no lock.
- TYPE:檔案型別,如DIR、REG等,常見的檔案型別:
(1)DIR:表示目錄 (2)CHR:表示字元型別 (3)BLK:塊裝置型別 (4)UNIX: UNIX 域套接字 (5)FIFO:先進先出 (FIFO) 佇列 (6)IPv4:網際協議 (IP) 套接字
- DEVICE:指定磁碟的名稱
- SIZE:檔案的大小
- NODE:索引節點(檔案在磁碟上的標識)
- NAME:開啟檔案的確切名稱
例項2:查詢某個檔案相關的程序
$lsof /bin/bash COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld_sa 2169 root txt REG 253,0 938736 4587562 /bin/bash ksmtuned 2334 root txt REG 253,0 938736 4587562 /bin/bash bash 20121 root txt REG 253,0 938736 4587562 /bin/bash
例項3:列出某個使用者開啟的檔案資訊
$lsof -u username -u 選項,u是user的縮寫
例項4:列出某個程式程序所開啟的檔案資訊
$lsof -c mysql
-c 選項將會列出所有以mysql這個程序開頭的程式的檔案,其實你也可以寫成 lsof | grep mysql, 但是第一種方法明顯比第二種方法要少打幾個字元;
例項5:列出某個使用者以及某個程序所開啟的檔案資訊
$lsof -u test -c mysql
例項6:通過某個程序號顯示該程序開啟的檔案
$lsof -p 11968
例項7:列出所有的網路連線
$lsof -i
例項8:列出所有tcp 網路連線資訊
$lsof -i tcp $lsof -n -i tcp COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME svnserve 11552 weber 3u IPv4 3799399 0t0 TCP *:svn (LISTEN) redis-ser 25501 weber 4u IPv4 113150 0t0 TCP 127.0.0.1:6379 (LISTEN)
例項9:列出誰在使用某個埠
$lsof -i :3306
例項10:列出某個使用者的所有活躍的網路埠
$lsof -a -u test -i
例項11:根據檔案描述列出對應的檔案資訊
$lsof -d description(like 2)
示例:
$lsof -d 3 | grep PARSER1 tail 6499 tde 3r REG 253,3 4514722 417798 /opt/applog/open/log/HOSTPARSER1_ERROR_141217.log.001
說明: 0表示標準輸入,1表示標準輸出,2表示標準錯誤,從而可知:所以大多數應用程式所開啟的檔案的 FD 都是從 3 開始
例項12:列出被程序號為1234的程序所開啟的所有IPV4 network files
$lsof -i 4 -a -p 1234
例項13:列出目前連線主機nf5260i5-td上埠為:20,21,80相關的所有檔案資訊,且每隔3秒重複執行
lsof -i @nf5260i5-td:20,21,80 -r 3