目錄:
1、lsof 簡介
2、lsof 常用用法
2.1 監控開啟的檔案、裝置
2.2 監控檔案系統
2.3 監控進程
2.4 監控網路
3、更多提示
3.1 監控用戶
3.2 監控應用程式
4、命令模式技巧
4.1 組合邏輯查詢條件
4.2 lsof 命令的重複執行模式:
5、最後的技巧
Linux lsof 命令詳解
Linux lsof命令使用詳解
lsof---Linux查看檔案資訊的強大工具
用lsof恢複誤刪的檔案
Linux命令lsof查看當前系統的IO情況
1、lsof 簡介
lsof 是 linux 下的一個非常實用的系統級的監控、診斷工具。
它的意思是 List Open Files,很容易你就記住了它是 “ls + of”的組合~
它可以用來列出被各種進程開啟的檔案資訊,記住:linux 下 “一切皆檔案”,
包括但不限於 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以擷取任何被開啟檔案的各種資訊。
只需輸入 lsof 就可以產生大量的資訊,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份運行它才能夠充分地發揮其功能。
lsof 的樣本輸出:
root@YLinux:~/lab 0# lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,6 4096 2 /
systemd 1 root rtd DIR 8,6 4096 2 /
systemd 1 root txt REG 8,6 2273340 1834909 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.s
...
2、lsof 常用用法
2.1 監控開啟的檔案、裝置
查看檔案、裝置被哪些進程佔用
# lsof /dev/tty1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1770 jian 0u CHR 4,1 0t0 1045 /dev/tty1
bash 1770 jian 1u CHR 4,1 0t0 1045 /dev/tty1
bash 1770 jian 2u CHR 4,1 0t0 1045 /dev/tty1
bash 1770 jian 255u CHR 4,1 0t0 1045 /dev/tty1
startx 1845 jian 0u CHR 4,1 0t0 1045 /dev/tty1
startx 1845 jian 1u CHR 4,1 0t0 1045 /dev/tty1
...
2.2 監控檔案系統
指定目錄、掛載點,可以看到有哪些進程開啟了其下的檔案:
# 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
列出被指定進程名開啟的檔案:
# lsof -c ssh -c init
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root txt REG 8,1 124704 917562 /sbin/init
init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so
init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so
...
ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null
ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null
ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
2.3 監控進程
指定進程號,可以查看該進程開啟的檔案:
# lsof -p 2064
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox 2064 jian cwd DIR 8,6 4096 1571780 /home/jian
firefox 2064 jian rtd DIR 8,6 4096 2 /
firefox 2064 jian txt REG 8,6 44224 1985670 /usr/lib/firefox-12.0/firefox
firefox 2064 jian mem REG 8,6 14707012 925361 /usr/share/fonts/chinese/msyhbd.ttf
firefox 2064 jian mem REG 8,6 15067744 925362 /usr/share/fonts/chinese/msyh.ttf
firefox 2064 jian mem REG 8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc
firefox 2064 jian mem REG 0,16 67108904 10203 /dev/shm/pulse-shm-3021850167
...
當你想要殺掉某個使用者所有開啟的檔案、裝置,你可以這樣:
kill -9 `lsof -t -u lakshmanan`
此處 -t 的作用是單獨的列出 進程 id 這一列。
2.4 監控網路
查看指定連接埠有哪些進程在使用(lsof -i 列出所有的開啟的網路連接):
# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1569 root 3u IPv4 10303 0t0 TCP *:ssh (LISTEN)
sshd 1569 root 4u IPv6 10305 0t0 TCP *:ssh (LISTEN)
...
列出被某個進程開啟所有的網路檔案:
lsof -i -a -p 234
或者
lsof -i -a -c ssh
列出所有 tcp、udp 串連:
lsof -i tcp;
lsof -i udp;
列出所有 NFS 檔案:
lsof -N -u lakshmanan -a
查看指定網口有哪些進程在使用:
# lsof -i@192.168.1.91
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
skype 1909 jian 54u IPv4 9116 0t0 TCP 192.168.1.91:40640->64.4.23.153:40047 (ESTABLISHED)
pidgin 1973 jian 7u IPv4 6599 0t0 TCP 192.168.1.91:59311->hx-in-f125.1e100.net:https (ESTABLISHED)
pidgin 1973 jian 13u IPv4 9260 0t0 TCP 192.168.1.91:54447->by2msg3010511.phx.gbl:msnp (ESTABLISHED)
...