1. lsof是什麼?
lsof是linux下面乙個tool,用來列出當前系統中所開啟的檔案,這些檔案包括
正規檔案、目錄、管道、字元裝置、塊裝置、unix socket等等。
2. 那lsof有什麼作用呢?
(1)你的程式有沒有出現過open檔案失敗的情況?那我們可以通過lsof來檢視系統中已經
open了多少檔案,會不會跟這有關係。
從以下的結果你可以看到系統預設的最大open files是1024個,所以如果你已經開啟了
1024個檔案了,那就會open失敗了。
通常發生此問題的原因都是程式中呼叫了open,但是用完檔案之後卻沒有去close。
sh-# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 2293
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
posix message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2293
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我們做個試驗,故意將open files數目改為1,你會發現很多linux command已經無法執行了。
sh-# ulimit -n 1
sh-# ls
ls: error while loading shared libraries: librt.so.1: cannot open shared object file: error 24
sh-# busybox which
busybox: error while loading shared libraries: libm.so.6: cannot open shared object file: error 24
(2)從lsof的執行結果,我們也可以看到有哪些user正在使用當前的file system;
或者是當前file system中有哪些已經被開啟的檔案。
sh-# umount /mnt/sda1/
umount: /mnt/usb/sda1: device is busy.
(in some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
當unmount乙個file system失敗時,可以使用lsof來檢視你的file system是否仍然有正在open著的檔案。
sh-# ./lsof /mnt/sda1/
command pid user fd type device size/off node name
ooxx 537 root 46r reg 8,1 6 45 /mnt/sda1/test.txt
可以看到有乙個test.txt是開啟的,所以需要先close這個檔案再去unmount才能成功。
(3)有時候我們能夠使用lsof來恢復那些已經刪除掉(比如說誤刪)的檔案,為什麼能做到?
這是因為這些open的檔案在ram中都有對應的映像,所以我們就可以用/proc這個特殊的
file system來恢復,具體步驟是:
a. 使用lsof查到哪個process開啟了這個檔案,以及這個被開啟檔案的file descriptor:
sh-3# ./lsof | grep test.txt
process_name 747 root 46r reg 8,1 6 45 /mnt/sda1/test.txt (deleted)
process_name 747 541 root 46r reg 8,1 6 45 /mnt/sda1/test.txt (deleted)
b. 接下來你會發現這果然就是你之前刪掉的檔案的內容:
sh-# cat /proc/747/fd/46
dfdfd
c. 將這個誤刪的檔案小心翼翼的存回去:
sh-3.2# cat /proc/537/fd/46 > /mnt/usb/sda1/restore.txt
sh-3.2# cat /mnt/usb/sda1/restore.txt
dfdfd
2013/09/13補充:
剛做了試驗來確認,如果檔案被open,再被delete,再被close之後就不能利用這種辦法來恢復delete的檔案了。
因為檔案被close了,該檔案對應的file descriptor被系統**,所以在/proc/pid/fd/中就沒有對應檔案的
file descriptor了。所以,使用lsof也只能去恢復那些被delete但是仍然是open的檔案。
以上是個人學習過程中的一些心得和應用,實際上lsof這個tool的功能是非常非常的強大。
後面如果有新的應用,會再分享出來;如果有任何問題,非常歡迎提出來討論,謝謝。
Linux Lsof命令詳解
一般root使用者才能執行lsof命令,普通使用者可以看見 usr sbin lsof命令,但是普通使用者執行會顯示 permission denied 我總結一下lsof指令的用法 lsof abc.txt 顯示開啟檔案abc.txt的程序 lsof i 22 知道22埠現在執行什麼程式 lsof...
linux lsof命令詳解
lsof list open files 是乙個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以如傳輸控制協議 tcp 和使用者資料報協議 udp 套接字等,系統在後台都為該應用程式分配了乙個檔案描述符,無論這...
Linux lsof命令詳解
lsof list open files 是乙個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。在終端下輸入lsof即可顯示系統開啟的檔案,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者...