1. 程式人生 > >linux 命令 lsof 詳解

linux 命令 lsof 詳解

簡介

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

輸出資訊含義

在終端下輸入lsof即可顯示系統開啟的檔案,因為 lsof

需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份執行它才能夠充分地發揮其功能。

直接輸入lsof部分輸出為:

1

2

3

4

5

6

7

8

9

10

11

12

13

COMMAND     PID        USER   FD      TYPE             DEVICE SIZE/OFFNODE 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

dd1271        root    0r      REG                0,3        0 4026532038 /proc/kmsg

dd1271        root    1w     FIFO               0,15      0t0        409 /run/klogd/kmsg

dd1271        root    2u      CHR                1,3      0t0       6254 /dev/null

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

lsof輸出各列資訊的意義如下:

COMMAND:程序的名稱 PID:程序識別符號

USER:程序所有者

FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwdtxt TYPE:檔案型別,如DIRREG

DEVICE:指定磁碟的名稱

SIZE:檔案的大小

NODE:索引節點(檔案在磁碟上的標識)

NAME:開啟檔案的確切名稱


FD
列中的檔案描述符cwd 值表示應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改,txt 型別的檔案是程式程式碼,如應用程式二進位制檔案本身或共享庫,如上列表中顯示的 /sbin/init 程式。

其次數值表示應用程式的檔案描述符,這是開啟該檔案時返回的一個整數。如上的最後一行檔案/dev/initctl,其檔案描述符為 10u 表示該檔案被開啟並處於讀取/寫入模式,而不是隻讀 ® 或只寫 (w) 模式。同時還有大寫W 表示該應用程式具有對整個檔案的寫鎖。該檔案描述符用於確保每次只能開啟一個應用程式例項。初始開啟每個應用程式時,都具有三個檔案描述符,從 0 2,分別表示標準輸入、輸出和錯誤流。所以大多數應用程式所開啟的檔案的 FD 都是從 3 開始。

FD 列相比,Type 列則比較直觀。檔案和目錄分別稱為 REG DIR。而CHR BLK,分別表示字元和塊裝置;或者 UNIXFIFO IPv4,分別表示 UNIX 域套接字、先進先出 (FIFO) 佇列和網際協議 (IP) 套接字。

常用引數

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

lsof語法格式是:

lsofoptionsfilename

lsofabc.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 顯示使用fd4的程序

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可以找出那些程序在使用當前要解除安裝的檔案系統,如下:

1

2

3

4

# lsof /GTES11/

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

bash4208 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檔案,如下:

1

2

# lsof |grep /var/log/messages

syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages(deleted)

從上面的資訊可以看到 PID 1283syslogd)開啟檔案的檔案描述符為 2。同時還可以看到/var/log/messages已經標記被刪除了。因此我們可以在 /proc/1283/fd/2 fd下的每個以數字命名的檔案表示程序對應的檔案描述符)中檢視相應的資訊,如下:

1

2

3

4

# 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/kmsgstarted.

Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 ([email protected]) (gccversion 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
對於許多應用程式,尤其是日誌檔案和資料庫,這種恢復刪除檔案的方法非常有用。

實用命令

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

lsof`whichhttpd` //那個程序在使用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 //顯示那些檔案被pid30297的程序開啟

lsof-D /tmp顯示所有在/tmp資料夾中開啟的instance和檔案的程序。但是symbol檔案並不在列

lsof-u1000 //檢視uid100的使用者的程序的檔案使用情況

lsof-utony //檢視使用者tony的程序的檔案使用情況

lsof-u^tony //檢視不是使用者tony的程序的檔案使用情況(^是取反的意思)

lsof-i //顯示所有開啟的埠

lsof-i:80 //顯示所有開啟80埠的程序

lsof-i -U //顯示所有開啟的埠和UNIX domain檔案

lsof-i [email protected][url]www.akadia.com:123 //顯示那些程序打開了到www.akadia.comUDP123(ntp)埠的連結

lsof-i [email protected]:ftp-r //不斷檢視目前ftp連線的情況(-rlsof會永遠不斷的執行,直到收到中斷訊號,+rlsof會一直執行,直到沒有檔案被顯示,預設是15s重新整理)

lsof-i [email protected]:ftp-n //lsof-n 不將IP轉換為hostname,預設是不加上-n引數

引用:http://www.cnblogs.com/ginvip/p/6539393.html

細節影響成敗,感謝 琴酒網路 的總結整理。

相關推薦

linux 命令 lsof

簡介lsof(list open files)是一個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以如傳輸控制協議 (TCP) 和使用者資料報協議 (UDP) 套接字等,系統在後臺都為該

99%的程式設計師都會實用到的Linux命令—— grep

​ grep 是Linux系統非常強大的基本行的文字檢索工具,以下為常用的 grep命令: -i 不區分大小 -c 統計匹配行數 -n 輸出行號 -v 反向匹配 -m 指定個數 –color 顏色突出 -A 匹配後多少行 -B 匹

菜鳥級別的一些最基礎的linux命令例項

1、剛連線到虛擬機器,如下圖,劃紅線的‘~’表示進入的你這個使用者的當前目錄,瞭解下,作用不大,每條命令輸入完成後都是按enter鍵確定: 2、首先進入到根目錄,根目錄中是囊括了這臺機子裡所有的東西,命令是:cd /,如下,劃線部分已經變成了/,表示進入根目錄了: 3、

linux命令top

top命令是用來監控linux系統的執行狀況,如CPU,記憶體的使用情況。對於結果的資料有些不太清楚,在此詳細的記錄下 上圖是執行top命令的結果圖,對比上圖進行分析。 第一行 top    -17:20:04    |     up 13  days,  3:1

Linux 命令 awk

awk簡介awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言,三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的

linux 命令 tr

[email protected]:~$ tr --help Usage: tr [OPTION]... SET1 [SET2] Translate, squeeze, and/or delete characters from standard input, writing to stand

linux 命令 route

Destination 目標           The destination network or destination host. 目標網路或目標主機。     Gateway 閘道器           The gateway address or '*' if none set.

Linux性能監控命令lsof

轉換 device symbol 能夠 基礎 打開 init 可執行文件 ive 1. lsof 命令介紹 lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問

Linux vmstat命令實戰

上下文切換 span 一次 過多 sta log 讀取文件 負載 監控 vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜

linux流量監控iftop命令安裝

libpcap 安裝 流量 指定 evel .tar.gz 之前 完成 configure iftop跟nload差不多,也是捕獲網卡流量的命令,nload的安裝見之前發布的教程:http://www.cnblogs.com/catlee/p/5703541.html 開

LINUX下分區命令Parted

運行 script mbr gpt分區 ble 版本號 may was mkpart 通常劃分分區工具我們用的比較多是fdisk命令,但是現在由於磁盤越來越廉價,而且磁盤空間越來越大。而fdisk工具他對分區是有大小限制的,它只能劃分小於2T的磁盤。現在的磁盤

linux中cat、more、less命令區別

more|less本文轉自:http://blog.csdn.net/xyw_blog/article/details/16861681在《Python絕技》這本書的第一個小程序首先展示了針對與unix系統中shadow文件密碼的暴力破解的能力,因為之前只是對shadow文件停留在保存了用戶密碼的階段,但並沒

(轉)linux nc命令使用

遠程拷貝 工作 主機 lin con gin browser -s 反向連接 linux nc命令使用詳解 原文:https://www.2cto.com/os/201306/220971.html 功能說明:功能強大的網絡工具 語  法:nc [-hlnruz][-g&

(轉)linux paste命令用法

--help 分類 chroot 幫助 情況下 alias query 技術分享 一次 linux paste命令用法詳解原文:http://www.xfcodes.com/linuxcmd/mulu/10211.htmlinux下paste命令,可用於合並文件的列。 功能

[svc]Linux vmstat命令實戰

cpu 內存 磁盤 性能 介紹 給定 不足 code 大量 進程阻塞 log vmstat輸出 註:是cpu 內存 磁盤 虛擬內存交換情況 io讀寫情況 vmstat命令是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,

Linux常用命令示例(一)-檔案管理

1、touch 命令 使用說明: Linux touch命令用於修改檔案或者目錄的時間屬性,包括存取時間和更改時間。若檔案不存在,系統會建立一個新的檔案。 使用語法: touch [-acfm][-d<日期時間>][-r<參考檔案或目錄>

Linux系列之SAR命令使用

1. CPU利用率 sar -p (檢視全天) sar -u 1 10 (1:每隔一秒,10:寫入10次) 1.1. CPU輸出項說明 輸出項 詳細說明 CPU all 表示統計資訊為

Linux的dd命令使用

http://blog.sina.com.cn/s/blog_8b5bb24f01016y3o.html   一、dd命令的解釋 dd:用指定大小的塊拷貝一個檔案,並在拷貝的同時進行指定的轉換。 注意:指定數字的地方若以下列字元結

Linux程序監控命令ps

    ps是processes的縮寫,是對當前系統程序進行監控。要對程序進行監測和控制,首先必須要了解當前程序的情況,也就是需要檢視當前程序,ps命令就是最基本程序檢視命令。使用該命令可以確定有哪些程序正在執行和執行的狀態、程序是否結束、程序有沒有殭屍、哪些程序佔用了過多的資源

linux中mount命令引數 nfs 引數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!