lsof命令總結
轉:https://www.cnblogs.com/onmyway20xx/p/4425330.html
lsof命令總結
1、lsof 簡介
lsof 是 linux 下的一個非常實用的系統級的監控、診斷工具。
它的意思是 List Open Files,很容易你就記住了它是 “ls + of”的組合~
它可以用來列出被各種程序開啟的檔案資訊,記住:linux 下 “一切皆檔案”,
包括但不限於 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以獲取任何被開啟檔案的各種資訊。
只需輸入 lsof 就可以生成大量的資訊,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份執行它才能夠充分地發揮其功能。
lsof 的示例輸出:
檢視埠點用:
lsof -i tcp:9000
1 |
[email protected]:~/lab 0 # lsof |
2 |
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
systemd 1 root cwd DIR 8,6 4096 2 / |
4 |
systemd 1 root rtd DIR 8,6 4096 2 / |
5 |
systemd 1 root txt REG 8,6 2273340 1834909 /usr/lib/systemd/systemd |
6 |
systemd 1 root mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.s |
7 |
... |
2、lsof 常用用法
檢視檔案、裝置被哪些程序佔用
1 |
# lsof /dev/tty1 |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
bash 1770 jian 0u CHR 4,1 0t0 1045 /dev/tty1 |
4 |
bash 1770 jian 1u CHR 4,1 0t0 1045 /dev/tty1 |
5 |
bash 1770 jian 2u CHR 4,1 0t0 1045 /dev/tty1 |
6 |
bash 1770 jian 255u CHR 4,1 0t0 1045 /dev/tty1 |
7 |
startx 1845 jian 0u CHR 4,1 0t0 1045 /dev/tty1 |
8 |
startx 1845 jian 1u CHR 4,1 0t0 1045 /dev/tty1 |
9 |
... |
指定目錄、掛載點,可以看到有哪些程序打開了其下的檔案:
1 |
# lsof /data/ |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
bash 15983 jian cwd DIR 8,5 4096 8252 /data/backup |
4 |
... |
這在 umount 某個檔案系統失敗時非常有用(通常會報該 FS is busy)。
列出某個目錄(掛載點 如 /home 也行)下被開啟的檔案:
1 |
# lsof +D /var/log/ |
2 |
3 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
4 |
rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog |
5 |
rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log |
6 |
console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/ history |
列出被指定程序名開啟的檔案:
01 |
# lsof -c ssh -c init |
02 |
03 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
04 |
init 1 root txt REG 8,1 124704 917562 /sbin/init |
05 |
init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so |
06 |
init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so |
07 |
... |
08 |
ssh -agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null |
09 |
ssh -agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null |
10 |
ssh -agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ ssh -sUymKXxw1495/agent.1495 |
指定程序號,可以檢視該程序開啟的檔案:
01 |
# lsof -p 2064 |
02 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
03 |
firefox 2064 jian cwd DIR 8,6 4096 1571780 /home/jian |
04 |
firefox 2064 jian rtd DIR 8,6 4096 2 / |
05 |
firefox 2064 jian txt REG 8,6 44224 1985670 /usr/lib/firefox-12.0/firefox |
06 |
firefox 2064 jian mem REG 8,6 14707012 925361 /usr/share/fonts/chinese/msyhbd.ttf |
07 |
firefox 2064 jian mem REG 8,6 15067744 925362 /usr/share/fonts/chinese/msyh.ttf |
08 |
firefox 2064 jian mem REG 8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc |
09 |
firefox 2064 jian mem REG 0,16 67108904 10203 /dev/shm/pulse-shm-3021850167 |
10 |
... |
當你想要殺掉某個使用者所有開啟的檔案、裝置,你可以這樣:
1 |
kill -9 ` lsof -t -u lakshmanan` |
此處 -t 的作用是單獨的列出 程序 id 這一列。
關於殺死程序的 4 種方式,請參考:
http://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/
檢視指定埠有哪些程序在使用(lsof -i 列出所有的開啟的網路連線):
1 |
# lsof -i:22 |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
sshd 1569 root 3u IPv4 10303 0t0 TCP *: ssh (LISTEN) |
4 |
sshd 1569 root 4u IPv6 10305 0t0 TCP *: ssh (LISTEN) |
5 |
... |
列出被某個程序開啟所有的網路檔案:
1 |
lsof -i -a -p 234 |
或者
1 |
lsof -i -a -c ssh |
列出所有 tcp、udp 連線:
1 |
lsof -i tcp; |
2 |
lsof -i udp; |
列出所有 NFS 檔案:
1 |
lsof -N -u lakshmanan -a |
檢視指定網口有哪些程序在使用:
1 |
# lsof [email protected] |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
skype 1909 jian 54u IPv4 9116 0t0 TCP 192.168.1.91:40640->64.4.23.153:40047 (ESTABLISHED) |
4 |
pidgin 1973 jian 7u IPv4 6599 0t0 TCP 192.168.1.91:59311->hx- in -f125.1e100.net:https (ESTABLISHED) |
5 |
pidgin 1973 jian 13u IPv4 9260 0t0 TCP 192.168.1.91:54447->by2msg3010511.phx.gbl:msnp (ESTABLISHED) |
6 |
... |
3、更多使用技巧
檢視指定使用者開啟的檔案(lsof -u ^lakshmanan 可以排除某使用者):
1 |
# lsof -u messagebus |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
dbus-daem 1805 messagebus cwd DIR 8,6 4096 2 / |
4 |
dbus-daem 1805 messagebus rtd DIR 8,6 4096 2 / |
5 |
dbus-daem 1805 messagebus txt REG 8,6 1235361 1834948 /usr/bin/dbus-daemon |
6 |
dbus-daem 1805 messagebus mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.so |
7 |
dbus-daem 1805 messagebus mem REG 8,6 190145 1700642 /lib/libnss_nis-2.15.so |
8 |
dbus-daem 1805 messagebus mem REG 8,6 490366 1700636 /lib/libnsl-2.15.so |
9 |
... |
檢視指定程式開啟的檔案:
1 |
# lsof -c firefox |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
firefox 2064 jian cwd DIR 8,6 4096 1571780 /home/jian |
4 |
firefox 2064 jian rtd DIR 8,6 4096 2 / |
5 |
firefox 2064 jian txt REG 8,6 44224 1985670 /usr/lib/firefox-12.0/firefox |
6 |
firefox 2064 jian mem REG 8,6 14707012 925361 /usr/share/fonts/chinese/msyhbd.ttf |
7 |
firefox 2064 jian mem REG 8,6 15067744 925362 /usr/share/fonts/chinese/msyh.ttf |
8 |
firefox 2064 jian mem REG 8,6 16791251 1701681 /usr/share/fonts/wenquanyi/wqy-zenhei.ttc |
9 |
... |
4、命令模式技巧
只有多個查詢條件都滿足, 用 "-a" 引數,預設是 -o 。
1 |
# lsof -a -c bash -u root |
2 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
3 |
bash 1986 root cwd DIR 8,6 4096 1701593 /root/lab |
4 |
bash 1986 root rtd DIR 8,6 4096 2 / |
5 |
bash 1986 root txt REG 8,6 1994157 1700632 /bin/ bash |
6 |
bash 1986 root mem REG 8,6 9690800 405214 /usr/lib/locale/locale-archive |
7 |
bash 1986 root mem REG 8,6 210473 1700647 /lib/libnss_files-2.15.so |
基於給定的引數延時多少秒重複執行 lsof
+r 表示 當沒有檔案被開啟的時候,repeat mode 將自行結束。
-r 表示 不管檔案是否存在或者被開啟,它都將執行,直到你中斷它。
每個迴圈的輸出使用 ‘=======’ 做分隔符,你也可以用 ‘-r’ | ‘+r’ 指定延時時間。
01 |
# lsof -u lakshmanan -c init -a -r5 |
02 |
03 |
======= |
04 |
======= |
05 |
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
06 |
inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan |
07 |
inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 / |
08 |
inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash |
09 |
inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so |
10 |
inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so |
11 |
inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4 |
12 |
inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4 |
13 |
inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4 |
14 |
inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh |
15 |
======= |
以上輸出是前 5 秒沒有輸出,然後 “inita.sh” 啟動後,開始有了輸出。
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 還有很多很多,不過哥常用、知道的就這些了,哥也只能幫你到這兒了,
如果你還需要其它的內容,請自行 google 吧,騷年。。。
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
持續學習、持續收穫才能帶來持續的滿足和快樂!