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