1. 程式人生 > >linux常用命令雜記(一)--Lsof

linux常用命令雜記(一)--Lsof

linux 根據 打開文件 cte data 由於 uid 內部 方法

lsof的用法

lsof全名list opened files,也就是列舉系統中已經被打開的文件。linux環境中,任何事物都是文件,設備是文件,目錄是文件,甚至sockets也是文件。所以,用好lsof命令,對日常的linux管理非常有幫助。

lsof是linux最常用的命令之一,通常的輸出格式為:
#lsof +d /usr/local/
#lsof -i :22 知道22端口現在運行什麽程序
等等
查看相應用法可以查看man幫助查找對應選項:man lsof

常見包括如下幾個字段:

1、COMMAND默認以9個字符長度顯示命令名稱。可使用+c參數指定顯示的寬度,若+c後跟的參數為零,則顯示命令的全名(-c)

2、PID 進程的ID號(-p )

3、TID 如果是一個線程,顯示線程 ID

4、USER 命令的執行UID或系統中登陸的用戶名稱。(-u)

5、FD 是文件描述符 File Descriptor number(-d)

6、TYPE 類型

7、DEVICE 使用character special、block special表示的設備號

8、SIZE/OFF 文件的大小,如果不能用大小表示的,會留空。

9、NODE 本地文件的inode id

10、掛載點和文件的全路徑(鏈接會被解析為實際路徑),或者連接雙方的地址和端口、狀態等

使用樣例:

lsof urfile 顯示這個文件(ufile)被哪個程序調用

lsof -c systemd 顯示systemd 進程使用了哪些文件

lsof -p pid 使用 pid 顯示進程使用了哪些文件

lsof -i:22 顯示22端口被哪些ip使用

lsof +d /root 顯示 root 下被打開的文件,不遞歸

lsof +D /root 同上,遞歸

lsof -u username 顯示用戶打開的文件

lsof的其他用法

1.使用lsof 還可以恢復之前刪除的部分文件(內存中的進程還在)

詳細操作請移步:https://blog.csdn.net/dutsoft/article/details/51248761

lsof恢復刪除的內容的原理還是對刪除後,依然存留在內存中的進程的恢復。這就需要追溯到linux的儲存機制上了。對於許多應用程序,尤其是日誌文件和數據庫,這種恢復刪除文件的方法非常有用。

Linux文件的存儲機制和存儲結構:

        一個文件在文件系統中的存放分為兩個部分:數據部分和指針部分,指針位於文件系統的meta-data中,數據被刪除後,這個指針就從meta-data中清除了,而數據部分存儲在磁盤中,數據對應的指針從meta-data中清除後,文件數據部分占用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除abc.txt文件後,空間還沒釋放,就是因為python進程還在一直向這個文件寫入內容,導致雖然刪除了abc.txt文件,但文件對應的指針部分由於進程鎖定,並未從meta-data中清除,而由於指針並未被刪除,那麽系統內核就認為文件並未被刪除,因此通過df命令查詢空間並未釋放。          

      在文件系統處理文件需要的信息都存放在索引節點(inode)中,如果在刪除文件的時候索引節點的引用計數不為0(表示文件正在被使用),則不會在磁盤中真正的刪除文件,從而保證正在使用此文件的進程能夠正常的處理文件。

      首先我們一起來看一下內核中關於文件系統的一些關鍵數據結構的關聯,當一個進程打開一個文件後,便會在內核中創建一個file對象,這個對象主要描述了進程如何與文件進行交互。file對象中將指向一個dentry結構(目錄項),目錄項中描述了目錄項名稱,父目錄項信息,子目錄項信息等。而dentry中的d_inode所指向的inode節點中則包含了實際的文件存儲在磁盤上的信息。

       當多個進程打開同一個文件時,內核中變會創建相應的file對象,但是他們都公用同一個dentry,只不過每一次打開文件dentry的引用計數d_count加1。並且對於打開的同一個文件而言,inode也是唯一的,inode的引用計數i_count一般為文件硬鏈接的數目。

     Linux系統內部不使用文件名,而使用inode號碼來識別文件。對於系統來說,文件名只是inode號碼便於識別的別稱或者綽號。表面上,用戶通過文件名,打開文件。實際上,系統內部這個過程分成三步:首先,系統找到這個文件名對應的inode號碼;其次,通過inode號碼,獲取inode信息;最後,根據inode信息,找到文件數據所在的block,讀出數據。

linux常用命令雜記(一)--Lsof