lsof 一切皆檔案

2021-07-22 10:10:10 字數 4941 閱讀 9572

一、lsof(list open files)是乙個檢視當前系統檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。如傳輸控制協議 (tcp) 和使用者資料報協議 (udp) 套接字等,系統在後台都為該應用程式分配了乙個檔案描述符,該檔案描述符提供了大量關於這個應用程式本身的資訊。

lsof開啟的檔案可以是:

普通檔案

目錄網路檔案系統的檔案

字元或裝置檔案

(函式)共享庫

管道,命名管道

符號鏈結

網路檔案(例如:nfs file、網路socket,unix網域名稱socket)

還有其它型別的檔案,等等

二、命令引數

-a 列出開啟檔案存在的程序

-c《程序名》 列出指定程序所開啟的檔案

-g 列出gid號程序詳情

-d《檔案號》 列出占用該檔案號的程序

+d《目錄》 列出目錄下被開啟的檔案

+d《目錄》 遞迴列出目錄下被開啟的檔案

-n《目錄》 列出使用nfs的檔案

-i《條件》 列出符合條件的程序。(4、6、協議、:埠、 @ip )

-p《程序號》 列出指定程序號所開啟的檔案

-u 列出uid號程序詳情

-h 顯示幫助資訊

-v 顯示版本資訊

三、使用例項

例項1:無任何引數

$lsof| more

command pid user fd type device size/off node name

init 1 root cwd dir 253,0 4096 2 /

init 1 root rtd dir 253,0 4096 2 /

init 1 root txt reg 253,0 150352 1310795 /sbin/init

init 1 root mem reg 253,0 65928 5505054 /lib64/libnss_files-2.12.so

init 1 root mem reg 253,0 1918016 5521405 /lib64/libc-2.12.so

init 1 root mem reg 253,0 93224 5521440 /lib64/libgcc_s-4.4.6-20120305.so.1

init 1 root mem reg 253,0 47064 5521407 /lib64/librt-2.12.so

init 1 root mem reg 253,0 145720 5521406 /lib64/libpthread-2.12.so

...

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

command:程序的名稱

pid:程序識別符號

ppid:父程序識別符號(需要指定-r引數)

user:程序所有者

pgid:程序所屬組

fd:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等:

(1)cwd:表示current work dirctory,即:應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改

(2)txt :該型別的檔案是程式**,如應用程式二進位制檔案本身或共享庫,如上列表中顯示的 /sbin/init 程式

(3)lnn:library references (aix);

(4)er:fd information error (see name column);

(5)jld:jail directory (freebsd);

(6)ltx:shared library text (code and data);

(11)pd:parent directory;

(12)rtd:root directory;

(13)tr:kernel trace file (openbsd);

(15)0:表示標準輸出

(16)1:表示標準輸入

(17)2:表示標準錯誤

一般在標準輸出、標準錯誤、標準輸入後還跟著檔案狀態模式:r、w、u等

(1)u:表示該檔案被開啟並處於讀取/寫入模式

(2)r:表示該檔案被開啟並處於唯讀模式

(3)w:表示該檔案被開啟並處於

(4)空格:表示該檔案的狀態模式為unknow,且沒有鎖定

(5)-:表示該檔案的狀態模式為unknow,且被鎖定

同時在檔案狀態模式後面,還跟著相關的鎖

(1)n:for a solaris nfs lock of unknown type;

(2)r:for read lock on part of the file;

(3)r:for a read lock on the entire file;

(4)w:for a write lock on part of the file;(檔案的部分寫鎖)

(5)w:for a write lock on the entire file;(整個檔案的寫鎖)

(6)u:for a read and write lock of any length;

(7)u:for a lock of unknown type;

(8)x:for an sco openserver xenix lock on part of the file;

(9)x:for an sco openserver xenix lock on the entire file;

(10)space:if there is no lock.

type:檔案型別,如dir、reg等,常見的檔案型別:

(1)dir:表示目錄

(2)chr:表示字元型別

(3)blk:塊裝置型別

(4)unix: unix 域套接字

(5)fifo:先進先出 (fifo) 佇列

(6)ipv4:網際協議 (ip) 套接字

device:指定磁碟的名稱

size:檔案的大小

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

name:開啟檔案的確切名稱

$lsof /bin/bash

command pid user fd type device size/off node name

mysqld_sa 2169 root txt reg 253,0 938736 4587562 /bin/bash

ksmtuned 2334 root txt reg 253,0 938736 4587562 /bin/bash

bash 20121 root txt reg 253,0 938736 4587562 /bin/bash

例項3:列出某個使用者開啟的檔案資訊

$lsof -u username

-u 選項,u是user的縮寫

例項4:列出某個程式程序所開啟的檔案資訊

$lsof -c mysql

例項5:列出某個使用者以及某個程序所開啟的檔案資訊

$lsof  -u test -c mysql
例項6:通過某個程序號顯示該程序開啟的檔案

$lsof -p 11968
例項7:列出所有的網路連線

$lsof -i
例項8:列出所有tcp 網路連線資訊

$lsof -i tcp

$lsof -n -i tcp

command pid user fd type device size/off node name

svnserve 11552 weber 3u ipv4 3799399 0t0 tcp *:svn (listen)

redis-ser 25501 weber 4u ipv4 113150 0t0 tcp 127.0.0.1:6379 (listen)

例項9:列出誰在使用某個埠

$lsof -i :3306
例項10:列出某個使用者的所有活躍的網路埠

$lsof -a -u test -i
例項11:根據檔案描述列出對應的檔案資訊

$lsof -d description(like 2)
$lsof -d 3 | grep parser1
說明: 0表示標準輸入,1表示標準輸出,2表示標準錯誤,從而可知:所以大多數應用程式所開啟的檔案的 fd 都是從 3 開始

例項12:列出被程序號為1234的程序所開啟的所有ipv4 network files

$lsof -i 4 -a -p 1234

lsof -i @nf5260i5-td:20,21,80 -r 3

Linux 一切皆檔案

一切皆是檔案 是 unix linux 的基本哲學之一 不僅普通的檔案,目錄 字元裝置 塊裝置 套接字等在 unix linux 中都是以檔案被對待 它們雖然型別不同,但是對其提供的卻是同一套操作介面。檔案本質就是一種抽象,一般是指對資料的一種抽象。同時,檔案 也表示資料的儲存組織形式。資料庫就是另...

UNIX一切皆檔案!!

忘記從 聽到這樣一句話,unix一切皆檔案。下面是我的理解,這句話真的unix最精髓的一句話!我在研究管道的時候,用到popen和pclose,這裡popen返回值是file fp,大多是理解成管道,可以跟子程序的標準輸入輸出重定向,如果這裡把它看成是乙個檔案,那麼無非就是對這個檔案的寫或讀,無非這...

Linux 一切皆檔案

啟動乙個程序,需要乙個程式檔案,這是乙個二進位制檔案。啟動的時候,要載入一些配置檔案,例如 yml properties 等,這是文字檔案 啟動之後會列印一些日誌,如果寫到硬碟上,也是文字檔案。但是如果我想把日誌列印到互動控制台上,在命令列上唰唰地列印出來,這其實也是乙個檔案,是標準輸出 stdou...