linux lsof命令學習

2021-06-18 06:52:12 字數 3067 閱讀 2759

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 使用者...