lsof 是 linux 下的一個非常實用的系統級的監控、診斷工具。
它的意思是 List Open Files,很容易你就記住了它是 “ls + of”的組合~
它可以用來列出被各種進程打開的文件信息,記住:linux 下 “一切皆文件”,
包括但不限於 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以獲取任何被打開文件的各種信息。
只需輸入 lsof 就可以生成大量的信息,因爲 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。
lsof 的示例輸出:
[root@CDNTest69 wm]# lsof | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3656 /dev/null
init 1 root 1u CHR 1,3 0t0 3656 /dev/null
init 1 root 2u CHR 1,3 0t0 3656 /dev/null
init 1 root 3r FIFO 0,8 0t0 6679 pipe
init 1 root 4w FIFO 0,8 0t0 6679 pipe
2、lsof 常用用法
2.1 監控打開的文件、設備
查看文件、設備被哪些進程佔用
[root@CDNTest69 wm]# lsof /dev/tty1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mingetty 1491 root 0u CHR 4,1 0t0 5152 /dev/tty1
mingetty 1491 root 1u CHR 4,1 0t0 5152 /dev/tty1
mingetty 1491 root 2u CHR 4,1 0t0 5152 /dev/tty1
2.2 監控文件系統
指定目錄、掛載點,可以看到有哪些進程打開了其下的文件:[root@CDNTest69 wm]# lsof /home/wm/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2187 root cwd DIR 8,1 4096 5255364 /home/wm
vim 2215 root cwd DIR 8,1 4096 5255364 /home/wm
lsof 2238 root cwd DIR 8,1 4096 5255364 /home/wm
lsof 2239 root cwd DIR 8,1 4096 5255364 /home/wm
bash 31570 root cwd DIR 8,1 4096 5255364 /home/wm
2.3 監控進程
2.4 監控網絡
查看指定端口有哪些進程在使用(lsof -i 列出所有的打開的網絡連接):
[root@CDNTest69 wm]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1296 root 3u IPv4 9112 0t0 TCP *:ssh (LISTEN)
sshd 1296 root 4u IPv6 9114 0t0 TCP *:ssh (LISTEN)
sshd 2185 root 3r IPv4 3331745 0t0 TCP CDNTest69:ssh->172.31.11.74:ea (ESTABLISHED)
sshd 18642 root 3r IPv4 3120500 0t0 TCP CDNTest69:ssh->172.31.16.26:newlixengine (ESTABLISHED)
sshd 31568 root 3r IPv4 3309911 0t0 TCP CDNTest69:ssh->172.31.11.74:16980 (ESTABLISHED)
列出被某個進程打開所有的網絡文件:
lsof -i -a -p 234
或者
lsof -i -a -c ssh
列出所有 tcp、udp 連接:
lsof -i tcp;
lsof -i udp;
列出所有
NFS 文件:
lsof -N -u lakshmanan -a
查看指定網口有哪些進程在使用:
[root@CDNTest69 wm]# lsof [email protected]
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2185 root 3r IPv4 3331745 0t0 TCP CDNTest69:ssh->172.31.11.74:ea (ESTABLISHED)
sshd 18642 root 3r IPv4 3120500 0t0 TCP CDNTest69:ssh->172.31.16.26:newlixengine (ESTABLISHED)
sshd 31568 root 3r IPv4 3309911 0t0 TCP CDNTest69:ssh->172.31.11.74:16980 (ESTABLISHED)
3、更多使用技巧
3.1 監控用戶
查看指定用戶打開的文件(lsof -u ^lakshmanan 可以排除某用戶):
[root@CDNTest69 wm]# lsof -u root | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
3.2 監控應用程序
查看指定程序打開的文件:
[root@CDNTest69 wm]# lsof -c init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3656 /dev/null
init 1 root 1u CHR 1,3 0t0 3656 /dev/null
init 1 root 2u CHR 1,3 0t0 3656 /dev/null
init 1 root 3r FIFO 0,8 0t0 6679 pipe
init 1 root 4w FIFO 0,8 0t0 6679 pipe
init 1 root 5r DIR 0,10 0 1 inotify
init 1 root 6r DIR 0,10 0 1 inotify
init 1 root 7u unix 0xffff880037c17680 0t0 6680 socket
init 1 root 9u unix 0xffff88007d86c680 0t0 8688 socket
4、命令模式技巧
4.1 組合邏輯查詢條件
只有多個查詢條件都滿足, 用 "-a" 參數,默認是 -o 。
[root@CDNTest69 wm]# lsof -a -c bash -u root
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2187 root cwd DIR 8,1 4096 5255364 /home/wm
bash 2187 root rtd DIR 8,1 4096 2 /
bash 2187 root txt REG 8,1 938832 3014746 /bin/bash
bash 2187 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
bash 2187 root mem REG 8,1 22536 1048988 /lib64/libdl-2.12.so
bash 2187 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
bash 2187 root mem REG 8,1 138280 1049003 /lib64/libtinfo.so.5.7
bash 2187 root mem REG 8,1 99158576 3419352 /usr/lib/locale/locale-archive
bash 2187 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
bash 2187 root mem REG 8,1 26060 3411690 /usr/lib64/gconv/gconv-modules.cache
4.2 lsof 命令的重複執行模式:
基於給定的參數延時多少秒重複執行 lsof
+r 表示 當沒有文件被打開的時候,repeat mode 將自行結束。
-r 表示 不管文件是否存在或者被打開,它都將執行,直到你中斷它。
每個循環的輸出使用 ‘=======’ 做分隔符,你也可以用 ‘-r’ | ‘+r’ 指定延時時間。
[root@CDNTest69 wm]# lsof -u root -c init -a -r5
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150352 3804838 /sbin/init
init 1 root mem REG 8,1 65928 1048605 /lib64/libnss_files-2.12.so
init 1 root mem REG 8,1 1922152 1048653 /lib64/libc-2.12.so
init 1 root mem REG 8,1 93224 1048983 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root mem REG 8,1 47064 1048613 /lib64/librt-2.12.so
init 1 root mem REG 8,1 145720 1048682 /lib64/libpthread-2.12.so
init 1 root mem REG 8,1 268232 1048618 /lib64/libdbus-1.so.3.4.0
init 1 root mem REG 8,1 39896 1048709 /lib64/libnih-dbus.so.1.0.0
init 1 root mem REG 8,1 101920 1048711 /lib64/libnih.so.1.0.0
init 1 root mem REG 8,1 156912 1048604 /lib64/ld-2.12.so
init 1 root 0u CHR 1,3 0t0 3656 /dev/null
init 1 root 1u CHR 1,3 0t0 3656 /dev/null
init 1 root 2u CHR 1,3 0t0 3656 /dev/null
init 1 root 3r FIFO 0,8 0t0 6679 pipe
init 1 root 4w FIFO 0,8 0t0 6679 pipe
init 1 root 5r DIR 0,10 0 1 inotify
init 1 root 6r DIR 0,10 0 1 inotify
init 1 root 7u unix 0xffff880037c17680 0t0 6680 socket
init 1 root 9u unix 0xffff88007d86c680 0t0 8688 socket
5、最後的技巧
關於磁盤空間告警 df -h --max=1 與 du -hx --max=1 顯示不一致的問題,
最常見的的還是下面這種情況:
lsof|grep -i delete
看看被刪除的文件:有些刪了文件,但是進程沒 reload,那些空間還是佔用的,你可以理解爲類似 windows 下的進程句柄沒釋放的概念吧~ 只是 windows 下如果有文件被進程使用,你一般是刪不掉的,而 linux 雖然不做刪除限制,但卻要等到進程使用完文件才能完全釋放,以防止進程奔潰,這是操作系統對資源的管理差異吧~
例如 nginx 會有很多臨時文件佔用了 /tmp 目錄,刪掉後,依然佔用着空間,
此時你可以:
pkill -9 nginx && /etc/init.d/nginx restart
好吧,本文到此結束了,關於 lsof 還有很多很多,不過哥常用、知道的就這些了,哥也只能幫你到這兒了,
6、refer:
使用 lsof 查找打開的文件
http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html
15 Linux lsof Command Examples (Identify Open Files)
http://www.thegeekstuff.com/2012/08/lsof-command-examples/
實用的系統工具之 lsof
http://www.ylinux.org/forum/t/276