lsof的數十種高頻用法
本節索引
lsof工具簡介
lsof安裝方法
lsof高頻用法
lsof工具簡介
lsof是英文單詞是”list open files”的縮寫,見名知義,即是一個列出當前系統打開文件的工具。如果說 netcat 是進行網絡診斷的最好工具,那麽lsof 就是 Unix 調試的最好工具。
lsof 遵從 Unix 哲學的典範,它只做一件事情,並且做的相當完美。它打開的文件可能是普通的文件,目錄,NFS 文件,塊文件,字符文件,共享庫,常規管道,符號鏈接,Socket 流,網絡 Socket,UNIX 域Socket,以及其它更多。lsof的輸出除了生成單個輸出列表外,lsof還能以重復模式運行,在重復模式下,它將產生輸出,延遲,然後重復輸出操作,直到中斷或退出信號停止。
在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後臺都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。
文件描述目可使用stat命令來查看,如下
lsof安裝方法
許多 Unix 系統和Linux系統都內置了 lsof,提供lsof服務的包名就叫做lsof。如果你的系統沒有安裝,你可以從下面地址直接下載源代碼。https://people.freebsd.org/~abe/
BSD 系統有一個類似的工具也可以做同樣的事情,叫做 fstat。本文主要以Unix或Linux為例:
[root@vin ~]# yum install lsof -y # 由於我之前已經安裝過了 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Package lsof-4.87-4.el7.x86_64 already installed and latest version Nothing to do
lsof高頻用法
如何使用 lsof?本文章中我會盡力列舉我能想到的所有 lsof的用法,讓我們先從最簡單的開始,在逐漸過度到復雜用法。
### 查詢幫助 # man lsof # lsof -h 每認識一個服務或命令或工具,都要先查幫助。 ### 列出所有打開的文件;不帶任何參數運行 lsof 會列出所有進程打開的所有文件。 # lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,2 258 64 / systemd 1 root rtd DIR 8,2 258 64 / ... ### 找出誰在使用某個文件 # lsof /path/to/file 只需要執行文件的路徑,lsof 就會列出所有使用這個文件的進程. # lsof /path/to/file1 /path/to/file2 指定多個文件,lsof 會列出所有使用這些文件的進程 ### 遞歸查找某個目錄中所有打開的文件 # lsof +D /usr/lib # lsof | grep ‘/usr/lib‘ 加上 +D 參數,lsof 會對指定目錄進行遞歸查找,註意這個參數要比 grep 版本慢 。 之所以慢是因為 +D 首先查找所有的文件,然後一次性輸出。 ### 列出某個用戶打開的所有文件 # lsof -u python # lsof -u tom,root # lsof -u tom -u root -u 選項限定只列出所有被用戶 python 打開的文件,你可以通過逗號指定多個用戶 。 你也可以像第三條命令那樣使用多個 -u 做同樣的事情。 ### 查找某個程序打開的所有文件 # lsof -c apache # lsof -c apa # lsof -c apache -c python -c 選項限定只列出以某進程開頭的進程打開的文件;所以你可以不用像這樣寫 "lsof | grep jerry"而使用"lsof -c jerry" 你可以只制定進程名稱的開頭,上面第二條 同樣可以制定多個 -c 參數,例如上面第三條 ### 列出所有由某個用戶或某個進程打開的文件 # lsof -u vinsent -c apache 你也可以組合使用多個選項,這些選項默認進行或關聯,也就是說上面的命令會輸入由 vinsent 用戶或是 apache 進程打開的文件。 ### 列出所有由一個用戶與某個進程打開的文件 # lsof -a -u vinsent -c bash -a 參數可以將多個選項的組合條件由或變為與,上面的命令會顯示所有由 vinsent 用戶以及 bash 進程打開的文件。 ### 列出除 root 用戶外的所有用戶打開的文件 # lsof -u ^root root 前面的 ^ 符號,它執行取反操作,因此lsof 會列出所有 root 用戶之外的用戶打開的文件。 ### 列出所有由某個 PID 對應的進程打開的文件 # lsof -p 1 # lsof -p 450,980,333 -p 選項讓你可以使用進程 id 來過濾輸出。記住你也可以用逗號來分離多個 pid。 ### 列出所有進程打開的文件除了某個 pid 的 # lsof -p ^1 同前面的用戶一樣,你也可以對 -p 選項使用 ^ 來進行取反。 ### 列出所有網絡連接 # lsof -i lsof 的 -i 選項可以列出所有打開了網絡套接字(TCP 和 UDP)的進程。 ### 列出所有 TCP 網絡連接 # lsof -i tcp 也可以為 -i 選項加上參數,比如 tcp,tcp 選項會強制 lsof 只列出打開 TCP sockets 的進程。 ### 列出所有 UDP 網絡連接 # lsof -i udp 同樣 udp 讓 lsof 只列出使用 UDP socket 的進程。 ### 找到使用某個端口的進程 # lsof -i :25 # lsof -i :smtp :25 和 -i 選項組合可以讓 lsof 列出占用 TCP 或UDP 的 25 端口的進程。 你也可以使用 /etc/services 中制定的端口名稱來代替端口號,比如上面第二條。 ### 找到使用某個 udp 端口號或者某個 tcp 端口的進程 # lsof -i udp:53 # lsof -i tcp:80 ### 找到某個用戶的所有網絡連接 # lsof -a -u hacker -i 使用 -a 將 -u 和 -i 選項組合可以讓 lsof 列出某個用戶的所有網絡行為。 ### 列出所有 NFS(網絡文件系統)文件 # lsof -N 這個參數很好記,-N 就對應 NFS。 ### 列出所有 UNIX 域 Socket 文件 # lsof -U 這個選項也很好記,-U 就對應 UNIX。 ### 列出所有對應某個組 id 的進程 # lsof -g 1234 進程組用來邏輯上對進程進行分組,這個例子查找所有 PGID 為 1234 的進程打開的文件。 ### 列出所有與某個描述符關聯的文件 # lsof -d 2 # lsof -d 0-2 這個命令會列出所有以描述符 2 打開的文件;你也可以為描述符指定一個範圍。 上述第二條命令會列出所有描述符為 0,1,2 的文件。 ### 查看所有內存映射文件 # lsof -d mem ### 所有加載在內存中並正在執行的進程 # lsof -d txt ### 輸出使用某些資源的進程 pid # lsof -t -i -t 選項輸出進程的 PID,你可以將它和 -i 選項組合輸出使用某個端口的進程的 PID, ### kill所有使用網絡的進程 # kill -9 `lsof -t -i` ### 循環列出文件 # lsof -r 1 -r 選項讓 lsof 可以循環列出文件直到被中斷,參數 1 的意思是每秒鐘重復打印一次, 這個選項最好同某個範圍比較小的查詢組合使用。例如下面的例子。 ### 監測網絡活動 # lsof -r 1 -u tom -i -a
本文出自 “vinsent” 博客,請務必保留此出處http://vinsent.blog.51cto.com/13116656/1973760
lsof的數十種高頻用法