1. 程式人生 > >使用lsof工具檢視開啟的檔案和socket

使用lsof工具檢視開啟的檔案和socket

其實和fuser類似的,lsof使用的場景通常都是當你試圖mount一個檔案系統的時候,發現裝置繁忙
ibusybox:~ ibusybox$ umount /mnt
umount : /mnt: device is busy

這時候就可以用lsof檢視具體是什麼程序在訪問/mnt
用法lsof mountpoint
ibusybox:~ ibusybox$ lsof /mnt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Dock 121 ibusybox 21r DIR 1,2 612 526637 /mnt

就可以看到具體pid和使用者之類的資訊
相反如果想檢視程序訪問了哪些檔案,載入了哪些庫,或者是socket連線等等,就可以反過來用pid檢視
用法ls -p pid
ibusybox:~ ibusybox$ lsof -p 121
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Dock 121 ibusybox 21r DIR 1,2 612 526637 /mnt


另外lsof也支援通過程序名來檢視相關資訊
用法lsof -c processname
ibusybox:~ ibusybox$ lsof -c Dock
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Dock 121 ibusybox cwd DIR 1,2 1088 2 /
Dock 121 ibusybox txt REG 1,2 3091616 879965 /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock

如果你是root 想窺視一下其他兄弟在幹啥 也可以通過lsof先看看tty裝置訪問的情況
ibusybox:~ ibusybox$ lsof /dev/ttys000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 403 ibusybox 0u CHR 16,0 0t326502 623 /dev/ttys000
bash 403 ibusybox 1u CHR 16,0 0t326502 623 /dev/ttys000
bash 403 ibusybox 2u CHR 16,0 0t326502 623 /dev/ttys000
然後再lsof -u username 就可以檢視該使用者在訪問啥就一目瞭然了
ibusybox:~ ibusybox$ lsof -u ibusybox
Safari 192 ibusybox txt REG 1,2 50204 1673416 /private/var/folders/r9/kfjqnst15tb0ss2hk_4vk8zh0000gp/C/mds/mdsDirectory.db
Safari 192 ibusybox txt REG 1,2 32768 1673264 /private/var/db/mds/messages/se_SecurityMessages
Safari 192 ibusybox txt REG 1,2 2815 773626 /Applications/Safari.app/Contents/Resources/CertSecureStretch.png

通過lsof -i 也可以檢視已經佔用的socket埠,lsof -i :port可以直接檢視某指定埠
ibusybox:~ ibusybox$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
SystemUIS 123 ibusybox 5u IPv4 0x238afe528c39b56d 0t0 UDP *:*
NetworkBr 130 ibusybox 5u IPv4 0x238afe528c39b6f5 0t0 UDP *:*
Safari 206 ibusybox 10u IPv4 0x238afe528e701e75 0t0 UDP *:terabase
ubd 237 ibusybox 17u IPv4 0x238afe52901193e5 0t0 TCP *:23456 (LISTEN)

lsof是一個複雜而非常靈活的工具,可以man一下了解一下更多的細節