linux lsof命令詳解

來源:互聯網
上載者:User
簡介

lsof(list open files)是一個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連接和硬體。所以如傳輸控制通訊協定 (TCP) 和使用者資料包通訊協定 (UDP) 通訊端等,系統在後台都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有協助的。

 

輸出資訊含義

在終端下輸入lsof即可顯示系統開啟的檔案,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份運行它才能夠充分地發揮其功能。

直接輸入lsof部分輸出為:

COMMAND     PID        USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150584 654127 /sbin/init
udevd 415 root 0u CHR 1,3 0t0 6254 /dev/null
udevd 415 root 1u CHR 1,3 0t0 6254 /dev/null
udevd 415 root 2u CHR 1,3 0t0 6254 /dev/null
udevd 690 root mem REG 8,1 51736 302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so
syslogd 1246 syslog 2w REG 8,1 10187 245418 /var/log/auth.log
syslogd 1246 syslog 3w REG 8,1 10118 245342 /var/log/syslog
dd 1271 root 0r REG 0,3 0 4026532038 /proc/kmsg
dd 1271 root 1w FIFO 0,15 0t0 409 /run/klogd/kmsg
dd 1271 root 2u CHR 1,3 0t0 6254 /dev/null

每行顯示一個開啟的檔案,若不指定條件預設將顯示所有進程開啟的所有檔案。

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 [options] filename

lsof abc.txt 顯示開啟檔案abc.txt的進程
lsof -c abc 顯示abc進程現在開啟的檔案
lsof -c -p 1234 列出進程號為1234的進程所開啟的檔案
lsof -g gid 顯示歸屬gid的進程情況
lsof +d /usr/local/ 顯示目錄下被進程開啟的檔案
lsof +D /usr/local/ 同上,但是會搜尋目錄下的目錄,時間較長
lsof -d 4 顯示使用fd為4的進程
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 --> 連接埠號碼 (可以不止一個)
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
對於許多應用程式,尤其是記錄檔和資料庫,這種恢複刪除檔案的方法非常有用。

 

實用命令

lsof `which httpd` //那個進程在使用apache的可執行檔
lsof /etc/passwd //那個進程在佔用/etc/passwd
lsof /dev/hda6 //那個進程在佔用hda6
lsof /dev/cdrom //那個進程在佔用光碟機
lsof -c sendmail //查看sendmail進程的檔案使用方式
lsof -c courier -u ^zahn //顯示出那些檔案被以courier打頭的進程開啟,但是並不屬於使用者zahn
lsof -p 30297 //顯示那些檔案被pid為30297的進程開啟
lsof -D /tmp 顯示所有在/tmp檔案夾中開啟的instance和檔案的進程。但是symbol檔案並不在列

lsof -u1000 //查看uid是100的使用者的進程的檔案使用方式
lsof -utony //查看使用者tony的進程的檔案使用方式
lsof -u^tony //查看不是使用者tony的進程的檔案使用方式(^是取反的意思)
lsof -i //顯示所有開啟的連接埠
lsof -i:80 //顯示所有開啟80連接埠的進程
lsof -i -U //顯示所有開啟的連接埠和UNIX domain檔案
lsof -i UDP@[url]www.akadia.com:123 //顯示那些進程開啟了到www.akadia.com的UDP的123(ntp)連接埠的連結
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不斷查看目前ftp串連的情況(-r,lsof會永遠不斷的執行,直到收到中斷訊號,+r,lsof會一直執行,直到沒有檔案被顯示,預設是15s重新整理)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不將IP轉換為hostname,預設是不加上-n參數

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.