1.簡介:
lsof(list open files)是一個列出當前系統打開文件的工具。
只需輸入 lsof 就可以生成大量的信息,因為 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。
常用參數:
lsof語法格式是:
lsof [options] filename
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 --> 端口號 (可以不只一個)
lsof 的示例輸出:
[root@localhost ~]# lsof 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 2228266 /sbin/init init 1 root mem REG 253,0 65928 1966110 /lib64/libnss_files-2.12.so
lsof輸出各列信息的意義如下:
lsof輸出各列信息的意義如下:
COMMAND:進程的名稱 PID:進程標識符 USER:進程所有者 FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等 TYPE:文件類型,如DIR、REG等 DEVICE:指定磁盤的名稱 SIZE:文件的大小 NODE:索引節點(文件在磁盤上的標識) NAME:打開文件的確切名稱
2.lsof常用用法:
2.1 監控網絡
查看指定端口有哪些進程在使用(lsof -i 列出所有的打開的網絡連接):
[root@localhost ~]# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 17909 root 3u IPv4 2089344 0t0 TCP wx.9888.cn:ssh->bogon:61574 (ESTABLISHED) sshd 17911 www 3u IPv4 2089344 0t0 TCP wx.9888.cn:ssh->bogon:61574 (ESTABLISHED) sshd 17933 root 3u IPv4 277791 0t0 TCP *:ssh (LISTEN) sshd 17933 root 4u IPv6 277793 0t0 TCP *:ssh (LISTEN)
列出被某個進程打開所有的網絡文件:
[root@localhost ~]# lsof -i -a -p 29091 或者 [root@localhost ~]#lsof -i -a -c ssh
列出所有 tcp、udp 連接:
lsof -i tcp; lsof -i udp;
列出所有 NFS 文件:
[root@E08-8th02 ~]# lsof -N -u www -a
2.2 監控打開的文件設備:
查看文件、設備被哪些進程占用
[root@localhost ~]# lsof /dev/tty1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Xorg 1648 root 6u CHR 4,1 0t0 5613 /dev/tty1
2.3 監控文件系統:
指定目錄、掛載點,可以看到有哪些進程打開了其下的文件:
# lsof /data/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 15983 jian cwd DIR 8,5 4096 8252 /data/backup #這在 umount 某個文件系統失敗時非常有用(通常會報該 FS is busy)
列出某個目錄(掛載點 如 /home 也行)下被打開的文件:
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
列出被指定進程名打開的文件
[root@localhost ~]# lsof -c ssh -c init 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 2228266 /sbin/init init 1 root mem REG 253,0 65928 1966110 /lib64/libnss_files-2.12.so init 1 root DEL REG 253,0 1966094 /lib64/libc-2.12.so
2.4 監控進程:
指定進程號,可以查看該進程打開的文件:
[root@localhost ~]# lsof -p 29084 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 29084 www cwd DIR 253,0 4096 2359841 /apps/product/nginx/conf nginx 29084 www rtd DIR 253,0 4096 2 / nginx 29084 www txt REG 253,0 5497249 2359840 /apps/product/nginx/sbin/nginx
當你想要殺掉某個用戶所有打開的文件、設備,你可以這樣:
kill -9 `lsof -t -u www` #此處 -t 的作用是單獨的列出 進程 id 這一列。
2.5 監控用戶:
查看指定用戶打開的文件(lsof -u ^www可以排除某用戶):
[root@localhost ~]# lsof -u www COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME tail 2409 www cwd DIR 253,0 4096 2 / tail 2409 www rtd DIR 253,0 4096 2 / tail 2409 www txt REG 253,0 61368 670089 /usr/bin/tail tail 2409 www mem REG 253,0 156928 1972676 /lib64/ld-2.12.so
2.6 監控應用程序:
查看指定程序打開的文件:
[root@localhost ~]# lsof -c nginx COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 28624 root cwd DIR 253,0 4096 2359841 /apps/product/nginx/conf nginx 28624 root rtd DIR 253,0 4096 2 / nginx 28624 root txt REG 253,0 5497249 2359840 /apps/product/nginx/sbin/nginx
2.7 組合邏輯查詢條件:
只有多個查詢條件都滿足, 用 "-a" 參數,默認是 -o 。
[root@localhost ~]# lsof -a -c bash -u root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 25602 root cwd DIR 253,0 4096 1572865 /root bash 25602 root rtd DIR 253,0 4096 2 / bash 25602 root txt REG 253,0 938832 1703983 /bin/bash bash 25602 root mem REG 253,0 156928 1972676 /lib64/ld-2.12.so bash 25602 root mem REG 253,0 22536 1972681 /lib64/libdl-2.12.so