實用Linux命令 lsof

來源:互聯網
上載者:User
轉自部落格園:http://www.cnblogs.com/rootq/articles/1401850.htmllsof卸載移動儲存時經常提示device busy,也可能誤刪了一個正在開啟的檔案。。。。  
這時候可以試試lsof 
 
lsof簡介 
lsof(list open files)是一個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連接和硬體。所以如傳輸控制通訊協定 (TCP) 和使用者資料包通訊協定 (UDP) 通訊端等,系統在後台都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有協助的。
 
lsof使用 
  
lsof輸出資訊含義 
在終端下輸入lsof即可顯示系統開啟的檔案,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份運行它才能夠充分地發揮其功能。  
COMMAND    PID      USER   FD      TYPE     DEVICE     SIZE       NODE      NAME 
init       1         root  cwd      DIR       3,3       1024       2         / 
init       1         root  rtd      DIR       3,3       1024       2         / 
init       1         root  txt      REG       3,3       38432      1763452  /sbin/init 
init       1         root  mem      REG       3,3       106114     1091620  /lib/libdl-2.6.so 
init       1         root  mem      REG       3,3       7560696    1091614  /lib/libc-2.6.so 
init       1         root  mem      REG       3,3       79460      1091669  /lib/libselinux.so.1 
init       1         root  mem      REG       3,3       223280     1091668  /lib/libsepol.so.1 
init       1         root  mem      REG       3,3       564136     1091607  /lib/ld-2.6.so 
init       1         root  10u      FIFO      0,15                  1309     /dev/initctl 
每行顯示一個開啟的檔案,若不指定條件預設將顯示所有進程開啟的所有檔案。lsof輸出各列資訊的意義如下:  
COMMAND:進程的名稱 
PID:進程標識符 
USER:進程所有者 
FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等 
TYPE:檔案類型,如DIR、REG等 
DEVICE:指定磁碟的名稱 
SIZE:檔案的大小 
NODE:索引節點(檔案在磁碟上的標識) 
NAME:開啟檔案的確切名稱 
其中FD 列中的檔案描述符cwd 值表示應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄變更。 
txt 類型的檔案是程式碼,如應用程式二進位檔案本身或共用庫,如上列表中顯示的 /sbin/init 程式。其次數值表示應用 
程式的檔案描述符,這是開啟該檔案時返回的一個整數。如上的最後一行檔案/dev/initctl,其檔案描述符為 10。u 表示該 
檔案被開啟並處於讀取/寫入模式,而不是唯讀 或唯寫 (w) 模式。同時還有大寫 的W 表示該應用程式具有對整個檔案的寫 
鎖。該檔案描述符用於確保每次只能開啟一個應用程式執行個體。初始開啟每個應用程式時,都具有三個檔案描述符,從 0 到 2, 
分別表示標準輸入、輸出和錯誤流。所以大多數應用程式所開啟的檔案的 FD 都是從 3 開始。  
與 FD 列相比,Type 列則比較直觀。檔案和目錄分別稱為 REG 和 DIR。而CHR 和 BLK,分別表示字元和塊裝置; 
或者 UNIX、FIFO 和 IPv4,分別表示 UNIX 域通訊端、先進先出 (FIFO) 隊列和網際協議 (IP) 通訊端。  
lsof常用參數 
lsof 常見的用法是尋找應用程式開啟的檔案的名稱和數目。可用於尋找出某個特定應用程式將日誌資料記錄到何處,或者正在跟蹤某個問題。 
例如,linux限制了進程能夠開啟檔案的數目。通常這個數值很大,所以不會產生問題,並且在需要時,應用程式可以請求更大的值(直到某 
個上限)。如果你懷疑應用程式耗盡了檔案描述符,那麼可以使用 lsof 統計開啟的檔案數目,以進行驗證。lsof文法格式是:  
lsof [options] filename 
常用的參數列表:  
lsof  filename 顯示開啟指定檔案的所有進程 
lsof -a 表示兩個參數都必須滿足時才顯示結果 
lsof -c string   顯示COMMAND列中包含指定字元的進程所有開啟的檔案 
lsof -u username  顯示所屬user進程開啟的檔案 
lsof -g gid 顯示歸屬gid的進程情況 
lsof +d /DIR/ 顯示目錄下被進程開啟的檔案 
lsof +D /DIR/ 同上,但是會搜尋目錄下的所有目錄,時間相對較長 
lsof -d FD 顯示指定檔案描述符的進程 
lsof -n 不將IP轉換為hostname,預設是不加上-n參數 
lsof -i 用以顯示合格進程情況 
lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 
            46 --> IPv4 or IPv6 
            protocol --> TCP or UDP 
            hostname --> Internet host name 
            hostaddr --> IPv4地址 
            service --> /etc/service中的 service name (可以不只一個) 
            port --> 連接埠號碼 (可以不只一個) 
例如: 查看22連接埠現在啟動並執行情況  
# lsof -i :22 
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME 
sshd    1409 root    3u  IPv6   5678       TCP *:ssh (LISTEN) 
查看所屬root使用者進程所開啟的檔案類型為txt的檔案:  
# lsof -a -u root -d txt 
COMMAND    PID USER  FD      TYPE DEVICE    SIZE    NODE NAME 
init       1    root txt       REG    3,3   38432 1763452 /sbin/init 
mingetty  1632 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1633 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1634 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1635 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1636 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
mingetty  1637 root txt       REG    3,3   14366 1763337 /sbin/mingetty 
kdm        1638 root txt       REG    3,3  132548 1428194 /usr/bin/kdm 
X          1670 root txt       REG    3,3 1716396 1428336 /usr/bin/Xorg 
kdm        1671 root txt       REG    3,3  132548 1428194 /usr/bin/kdm 
startkde  2427 root txt       REG    3,3  645408 1544195 /bin/bash 
... ...   
lsof使用執行個體 
  
一、尋找誰在使用檔案系統 
在卸載檔案系統時,如果該檔案系統中有任何開啟的檔案,操作通常將會失敗。那麼通過lsof可以找出那些進程在使用當前要卸載的檔案系統,如下:  
# lsof  /GTES11/ 
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME 
bash    4208 root  cwd    DIR    3,1 4096    2 /GTES11/ 
vim     4230 root  cwd    DIR    3,1 4096    2 /GTES11/ 
在這個樣本中,使用者root正在其/GTES11目錄中進行一些操作。一個 bash是執行個體正在運行,並且它當前的目錄為/GTES11,另一個則顯示的是vim正在編輯/GTES11下的檔案。要成功地卸載/GTES11,應該在通知使用者以確保情況正常之後,中止這些進程。 這個樣本說明了應用程式的當前工作目錄非常重要,因為它仍保持著檔案資源,並且可以防止檔案系統被卸載。這就是為什麼大部分守護進程(後台進程)將它們的目錄更改為根目錄、或服務特定的目錄(如 sendmail 樣本中的 /var/spool/mqueue)的原因,以避免該守護進程阻止卸載不相關的檔案系統。
 
二、恢複刪除的檔案 
當Linux電腦受到入侵時,常見的情況是記錄檔被刪除,以掩蓋攻擊者的蹤跡。管理錯誤也可能導致意外刪除重要的檔案,比如在清理舊日誌時,意外地刪除了資料庫的活動交易記錄。有時可以通過lsof來恢複這些檔案。  
當進程開啟了某個檔案時,只要該進程保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,進程並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該進程之外,這個檔案是不可見的,因為已經刪除了其相應的目錄索引節點。  
在/proc 目錄下,其中包含了反映核心和進程樹的各種檔案。/proc目錄掛載的是在記憶體中所映射的一塊地區,所以這些檔案和目錄並不存在於磁碟中,因此當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中擷取相關資訊。大多數與 lsof 相關的資訊都儲存於以進程的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的進程的資訊。每個進程目錄中存在著各種檔案,它們可以使得應用程式簡單地瞭解進程的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號連結和其他系統資訊。lsof 程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以lsof
可以顯示進程的檔案描述符和相關的檔案名稱等資訊。也就是我們通過訪問進程的檔案描述符可以找到該檔案的相關資訊。  
   
當系統中的某個檔案被意外地刪除了,只要這個時候系統中還有進程正在訪問該檔案,那麼我們就可以通過lsof從/proc目錄下恢複該檔案的內容。 假如由於誤操作將/var/log/messages檔案刪除掉了,那麼這時要將/var/log/messages檔案恢複的方法如下:  
首先使用lsof來查看當前是否有進程開啟/var/logmessages檔案,如下:  
# lsof |grep /var/log/messages 
syslogd   1283      root    2w      REG        3,3  5381017    1773647 /var/log/messages (deleted) 
從上面的資訊可以看到 PID 1283(syslogd)開啟檔案的檔案描述符為 2。同時還可以看到/var/log/messages已經標記被刪除了。因此我們可以在 /proc/1283/fd/2 (fd下的每個以數字命名的檔案表示進程對應的檔案描述符)中查看相應的資訊,如下:  
# head -n 10 /proc/1283/fd/2 
Aug  4 13:50:15 holmes86 syslogd 1.4.1: restart. 
Aug  4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started. 
Aug  4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 
Aug  4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: 
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 0000000000000000 - 000000000009f000 (usable) 
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) 
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) 
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) 
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) 
Aug  4 13:50:15 holmes86 kernel:  BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved) 
從上面的資訊可以看出,查看 /proc/8663/fd/15 就可以得到所要恢複的資料。如果可以通過檔案描述符查看相應的資料,那麼就可以使用 I/O 重新導向將其複製到檔案中,如:  
cat /proc/1283/fd/2 > /var/log/messages  
對於許多應用程式,尤其是記錄檔和資料庫,這種恢複刪除檔案的方法非常有用。  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.