十堰網(wǎng)站建設(shè)兼職發(fā)軟文的平臺
文章目錄
- 一、簡介
- 二、lsof語法
- 2.1 基本格式
- 2.2 選項
- 2.3 輸出字段解釋
- 三、常用 lsof 操作
- 3.1 查看某文件的相關(guān)進程
- 3.2 網(wǎng)絡(luò)相關(guān):-i
- 3.3 指定進程號打開的文件:-p
- 3.4 指定用戶打開的文件:-u
- 3.5 某進程打開的文件:-c
- 3.6 復(fù)合查詢
- 四、進階用法
- 4.1用文本處理命令(grep\awk\sed)結(jié)合使用
- 4.2 更多實用選項
一、簡介
lsof(list open files
)是一個列出當(dāng)前系統(tǒng)打開文件的工具。
它主要用來獲取被進程打開文件的信息。
在 Linux 中,一切皆文件,lsof 命令可以查看所有已經(jīng)打開了的文件,比如:普通文件,目錄,特殊的塊文件,管道,socket 套接字,設(shè)備,Unix 域套接字等等。同時,它還可以結(jié)合 grep 以及 ps 命令進行更多的高級搜索
打開的文件:
在Linux中,一切都是文件,當(dāng)進程打開現(xiàn)有文件或創(chuàng)建新文件時,內(nèi)核向進程返回一個文件描述符,文件描述符就是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引,用來指向被打開的文件,所有執(zhí)行 I/O 操作的系統(tǒng)調(diào)用都會通過文件描述符。因此,打開的文件指的是進程打開并使用的文件。
二、lsof語法
2.1 基本格式
lsof [OPTIONS] [--] [NAMES]
在沒有任何選項的情況下,lsof 列出所有屬于活動進程的打開文件(一般會很多、很多、很多)。
2.2 選項
lsof
命令有很多選項,下面是一些常用的選項(完整的字節(jié)看手冊):
-a
:表示 AND,用于指定多個條件。-c <command>
:列出指定命令所打開的文件。-d <fd>
:列出指定文件描述符所打開的文件。-g <gid>
:列出指定組 ID 所屬的進程所打開的文件。-i
:列出所有打開了網(wǎng)絡(luò)套接字(TCP 和 UDP)的進程。-n
:禁止解析 IP 地址和端口號。-p <pid>
:列出指定進程 ID 所打開的文件。-u <username>
:列出指定用戶所屬的進程所打開的文件。
2.3 輸出字段解釋
使用lsof命令后輸出一般有9個字段(9列):
COMMAND:進程的名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符。主要有:cwd:應(yīng)用程序當(dāng)前工作目錄,這是該應(yīng)用程序啟動的目錄,除非它本身對這個目錄進行更改txt:該類型的文件是程序代碼,如應(yīng)用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序lnn:庫引用(AIX)err:FD 信息錯誤jld:監(jiān)獄目錄(FreeBSD)ltx:共享庫文本(代碼和數(shù)據(jù))mxx:十六進制內(nèi)存映射類型號 xxm86:DOS合并映射文件mem:內(nèi)存映射文件mmap:內(nèi)存映射設(shè)備pd:父目錄rtd:根目錄tr:內(nèi)核跟蹤文件(OpenBSD)v86:VP/ix 映射文件0:標準輸出1:標準輸入2:標準錯誤文件描述符后一般還跟著文件狀態(tài)模式:r:只讀模式w:寫入模式u:讀寫模式空格:文件的狀態(tài)模式為 unknow,且沒有鎖定-:文件的狀態(tài)模式為 unknow,且被鎖定同時在文件狀態(tài)模式后面,還跟著相關(guān)的鎖:N:對于未知類型的 Solaris NFS 鎖r:文件部分的讀鎖R:整個文件的讀鎖w:文件的部分寫鎖W:整個文件的寫鎖u:任何長度的讀寫鎖U:用于未知類型的鎖x:用于部分文件上的 SCO OpenServer Xenix 鎖X:用于整個文件上的 SCO OpenServer Xenix 鎖space:無鎖TYPE:文件類型。常見的文件類型有:REG:普通文件DIR:表示目錄CHR:表示字符類型BLK:塊設(shè)備類型UNIX:UNIX 域套接字FIFO:先進先出隊列IPv4(6):IPv4(6) 套接字
DEVICE:磁盤名稱
SIZE:文件的大小或文件偏移量(以字節(jié)為單位)
NODE:索引節(jié)點
NAME:打開文件的確切名稱
例如:
root@CQUPTLEI:~# lsof -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 37u IPv4 1001 0t0 UDP *:sunrpc
systemd 1 root 39u IPv6 1007 0t0 UDP *:sunrpc
rpcbind 696 _rpc 5u IPv4 1001 0t0 UDP *:sunrpc
rpcbind 696 _rpc 7u IPv6 1007 0t0 UDP *:sunrpc
systemd-n 801 systemd-network 19u IPv4 22416 0t0 UDP CQUPTLEI:bootpc
systemd-r 803 systemd-resolve 12u IPv4 21343 0t0 UDP localhost:domain
avahi-dae 820 avahi 12u IPv4 24274 0t0 UDP *:mdns
avahi-dae 820 avahi 13u IPv6 24275 0t0 UDP *:mdns
三、常用 lsof 操作
3.1 查看某文件的相關(guān)進程
root@CQUPTLEI:~# lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 1188 root txt REG 252,2 1183448 132810 /usr/bin/bash
sh 3495 root txt REG 252,2 1183448 132810 /usr/bin/bash
bash 1520268 root txt REG 252,2 1183448 132810 /usr/bin/bash
bash 1520271 root txt REG 252,2 1183448 132810 /usr/bin/bash
bash 1666912 root txt REG 252,2 1183448 132810 /usr/bin/bash
3.2 網(wǎng)絡(luò)相關(guān):-i
-i
選項用于列出所有打開了網(wǎng)絡(luò)套接字(TCP 和 UDP)的進程。
常用的用法:
-i
:列出所有打開了網(wǎng)絡(luò)套接字(TCP 和 UDP)的進程。-i tcp
:列出所有打開了 TCP 網(wǎng)絡(luò)連接的進程。-i :<port>
:列出某個端口被哪些進程打開了。-i @<ip_address>
:列出某個 IP 地址被哪些進程打開了。-u <username> -i
:列出某個用戶打開了哪些網(wǎng)絡(luò)連接。
例:
root@CQUPTLEI:~# lsof -i :443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 978 root 10u IPv4 26143 0t0 TCP *:https (LISTEN)
nginx 983 www 10u IPv4 26143 0t0 TCP *:https (LISTEN)
nginx 984 www 10u IPv4 26143 0t0 TCP *:https (LISTEN)
3.3 指定進程號打開的文件:-p
-p
選項用于列出指定進程 ID 所打開的文件。
root@CQUPTLEI:~# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,2 4096 2 /
systemd 1 root rtd DIR 252,2 4096 2 /
systemd 1 root txt REG 252,2 1620224 136385 /usr/lib/systemd/systemd
systemd 1 root mem REG 252,2 1369384 134892 /usr/lib/x86_64-linux-gnu/libm-2.31.so
systemd 1 root mem REG 252,2 178528 136839 /usr/lib/x86_64-linux-gnu/libudev.so.1.6.17
systemd 1 root mem REG 252,2 1575112 138611 /usr/lib/x86_64-linux-gnu/libunistring.so.2.1.0
3.4 指定用戶打開的文件:-u
-u
選項用于列出指定用戶所屬的進程所打開的文件。
root@CQUPTLEI:~# ls /home
lighthouse ubuntu www
root@CQUPTLEI:~# lsof -u www
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/134/gvfsOutput information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 983 www cwd DIR 252,2 4096 2 /
nginx 983 www rtd DIR 252,2 4096 2 /
nginx 983 www txt REG 252,2 5060432 912450 /www/server/nginx/sbin/nginx
nginx 983 www mem REG 252,2 239896 131210 /usr/lib/x86_64-linux-gnu/libnss_systemd.so.2
nginx 983 www DEL REG 0,1 26134 /dev/zero
nginx 983 www DEL REG 0,1 26133 /dev/zero
nginx 983 www DEL REG 0,1 26132 /dev/zero
nginx 983 www DEL REG 0,1 26131 /dev/zero
3.5 某進程打開的文件:-c
-c 選項用于列出指定命令所打開的文件,不需要進程的完整名稱,可以使用進程名的一部分。
root@CQUPTLEI:~# lsof -c alist
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
alist 941 root cwd DIR 252,2 4096 1041395 /opt/alist
alist 941 root rtd DIR 252,2 4096 2 /
alist 941 root txt REG 252,2 43084616 1041396 /opt/alist/alist
alist 941 root mem-r REG 252,2 32768 1041407 /opt/alist/data/data.db-shm
alist 941 root 0r CHR 1,3 0t0 6 /dev/null
alist 941 root 1u unix 0xffffa05a31b67000 0t0 26720 type=STREAM
alist 941 root 2u unix 0xffffa05a31b67000 0t0 26720 type=STREAM
3.6 復(fù)合查詢
(1)同時滿足多個條件:-a
用戶www打開的tcp 443端口,邏輯與(and)
root@CQUPTLEI:~# lsof -a -u www -i tcp:443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 983 www 10u IPv4 26143 0t0 TCP *:https (LISTEN)
nginx 984 www 10u IPv4 26143 0t0 TCP *:https (LISTEN)
(2)滿足每個條件
不使用-a時,多個選項之間的關(guān)系是或(or)
root@CQUPTLEI:~# lsof -c ssh -c alist
輸出所有名稱含有ssh、alist的進程打開的文件。
四、進階用法
4.1用文本處理命令(grep\awk\sed)結(jié)合使用
例: 與grep命令結(jié)合使用
打印服務(wù)器所有tcp連接中,文件描述符為10的連接:
root@CQUPTLEI:~# lsof -i tcp | grep "10u"
alist 941 root 10u IPv6 31063 0t0 TCP *:5244 (LISTEN)
nginx 978 root 10u IPv4 26143 0t0 TCP *:https (LISTEN)
nginx 983 www 10u IPv4 26143 0t0 TCP *:https (LISTEN)
nginx 984 www 10u IPv4 26143 0t0 TCP *:https (LISTEN)
BT-Panel 2638 root 10u IPv4 23149843 0t0 TCP CQUPTLEI:8888->internettl.org:52156 (ESTABLISHED)
|
為管道符,表示將左邊的輸出作為右邊的輸入
例: 與awk命令結(jié)合使用
對Linux的dns服務(wù)器(named)打開的tcp連接,按照描述符升序打印
lsof -i tcp -n| awk '/named/{print $1,$2,$3,$4,$5,$6,$6,$8,$9}' | sort -n -k 4
root@CQUPTLEI:~# lsof -i tcp -n| awk '/named/{print $1,$2,$3,$4,$5,$6,$6,$8,$9}' | sort -n -k 4
named 945 bind 22u IPv4 29095 29095 TCP 127.0.0.1:953
named 945 bind 26u IPv4 26405 26405 TCP 127.0.0.1:domain
named 945 bind 27u IPv4 26405 26405 TCP 127.0.0.1:domain
named 945 bind 28u IPv4 26405 26405 TCP 127.0.0.1:domain
named 945 bind 32u IPv4 28479 28479 TCP 10.0.8.5:domain
named 945 bind 33u IPv4 28479 28479 TCP 10.0.8.5:domain
named 945 bind 34u IPv4 28479 28479 TCP 10.0.8.5:domain
named 945 bind 37u IPv6 26406 26406 TCP [::1]:domain
named 945 bind 38u IPv6 26406 26406 TCP [::1]:domain
named 945 bind 39u IPv6 26406 26406 TCP [::1]:domain
named 945 bind 42u IPv6 28513 28513 TCP [fe80::5054:ff:fe4b:ad85]:domain
named 945 bind 43u IPv6 28513 28513 TCP [fe80::5054:ff:fe4b:ad85]:domain
named 945 bind 44u IPv6 28513 28513 TCP [fe80::5054:ff:fe4b:ad85]:domain
named 945 bind 45u IPv6 29096 29096 TCP [::1]:953
named 945 bind 48u IPv4 36766 36766 TCP 172.17.0.1:domain
named 945 bind 49u IPv4 36766 36766 TCP 172.17.0.1:domain
named 945 bind 50u IPv4 36766 36766 TCP 172.17.0.1:domain
sort -n -k 4:
對結(jié)果排序,按照第四列數(shù)字升序
4.2 更多實用選項
lsof還有很多選項,比如:對文件夾遞歸搜索
-?, -h 顯示幫助信息
-a
參數(shù)被視為邏輯與 AND,會影響全部的參數(shù)
-A A在配置了 AFS 分布式網(wǎng)絡(luò)文件系統(tǒng)的系統(tǒng)上可用,其 AFS 內(nèi)核代碼是通過動態(tài)模塊實現(xiàn)的。通過 A 指定備用名稱列表文件,在該文件中可以找到動態(tài)模塊的內(nèi)核地址
-b避免 lsof 因調(diào)用可能阻塞的內(nèi)核函數(shù)而產(chǎn)生阻塞,比如 lstat(2)、readlink(2) 和 stat(2) 等內(nèi)核函數(shù)
-c C顯示出以字符或字符串 C 開頭的命令程序開啟的文件,如 lsof -c init。如果 C 以斜杠 / 開頭和結(jié)尾,則斜杠之間的字符被解釋為正則表達式。該選項可多次指定
+c W指定 COMMAND 列的寬度,單位字符。默認為 9
-C禁用從內(nèi)核的名稱緩存中報告任何路徑名
-D D指導(dǎo) lsof 使用設(shè)備緩存文件。該選項的使用有時受到限制。-D 必須后面跟著一個函數(shù)字母,函數(shù)字母后面可以有一個路徑名稱。lsof 識別以下功能字母:? 報告設(shè)備緩存文件路徑b 構(gòu)建設(shè)備緩存文件i 忽略設(shè)備緩存文件r 讀取設(shè)備緩存文件u 讀取并更新設(shè)備緩存文件
+D D遞歸搜索目錄 D。如顯示在 /usr/local 及其子目錄下被程序開啟的文件:lsof +D /usr/local
+d D非遞歸搜索目錄 D。如顯示在 /usr/local 下被程序開啟的文件:lsof +d /usr/local
-d FD指定文件描述符列表,可以采用逗號分隔,也可以指定范圍。比如 1,2,3 或 1-3。如果前面包含尖號,表示排除。如顯示 FD 為 4 的進程:lsof -d 4
+|-e S豁免(exempt)路徑名稱為 S 的文件系統(tǒng)不受可能阻塞的內(nèi)核函數(shù)調(diào)用的影響。+e 選項豁免 stat(2)、lstat(2) 和大多數(shù) readlink(2) 內(nèi)核函數(shù)調(diào)用。-e 選項只能豁免 stat(2) 和 lstat(2) 內(nèi)核函數(shù)調(diào)用
+|-E+E 指定使用端點信息顯示 Linux 管道、Linux UNIX 套接字和 Linux 偽終端文件,并顯示端點的文件。-E 則不顯示端點的文件
-F LIST指定字符列表 LIST,選擇輸出給另一程序處理的字段,各字段對應(yīng)的字符見下文
+|-f [cfgGn]f 本身澄清了路徑名參數(shù)的解釋方式。當(dāng)后面跟著 c、f、g、G 或 n 時,它指定要啟用(+)或抑制(-)內(nèi)核文件結(jié)構(gòu)信息。c 文件結(jié)構(gòu)使用計數(shù)(not Linux)f 文件結(jié)構(gòu)地址(not Linux)g 文件標志縮寫(Linux 2.6.22 及更高版本)G 十六進制文件標志(Linux 2.6.22 及更高版本)n 文件結(jié)構(gòu)節(jié)點地址(not Linux)
-g [PGID]選擇或排除屬于指定進程組的進程打開的文件。 進程組 ID 使用逗號分隔,如果 PGID 前面包含尖號,表示排除。若沒有指定 PGID,則顯示全部。如顯示 PGID 為 6 和 7 的進程:lsof -g6,7
-i [I]選擇其 Internet 地址與 -i 中指定的地址匹配的文件,若沒有相關(guān)地址被指定,則監(jiān)聽全部。用法: lsof -i [46][protocol][@hostname|hostaddr][:serivce|port]說明:4 6 分別表示 IPv4 和 IPv6 protocol: TCP or UDP hostname:主機名hostaddr:IPv4 或 IPv6 地址service:主機提供的服務(wù)的名稱,即 /etc/services 中的 service nameport:端口號
-K在支持任務(wù)(線程)報告方式的系統(tǒng)上輸出進程的任務(wù)(線程)列表
-k K指定內(nèi)核名稱列表文件,代替 /vmunix、/mach 等
-l禁止將 user ID 轉(zhuǎn)換為登錄的名稱,默認是登錄名稱
+|-L [L]+ 或 - 表示開啟或關(guān)閉顯示文件連接數(shù),如果只有單純的 +L,后面沒有任何數(shù)字,則表示顯示全部,如果后面有數(shù)字,只有文件連接數(shù)少于該數(shù)字的會被列出
+|-m M-m 指定一個內(nèi)核內(nèi)存文件 M ,代替 /dev/kmem 或 /dev/mem。+m 將裝載補充文件寫入標準輸出文件
+|-M啟用或禁用報告本地 TCP、UDP 和 UDPLITE 端口的端口映射器注冊
-n不將 IP 地址轉(zhuǎn)換為主機名
-N顯示 NFS 文件
-o始終顯示文件偏移量。它導(dǎo)致 SIZE/OFF 輸出列標題更改為 OFFSET
-o O指定在文件偏移量的 0t 之后要打印的小數(shù)位數(shù)
-O指示 lsof 避免被某些內(nèi)核操作阻塞。即在分叉的子進程中執(zhí)行它們。雖然使用此選項將減少 lsof 啟動開銷,但也可能導(dǎo)致 lsof 在內(nèi)核不響應(yīng)函數(shù)時掛起。謹慎使用此選項
-P禁止將網(wǎng)絡(luò)文件的端口號轉(zhuǎn)換為端口名
-p S排除或選擇進程的文件列表,進程 ID 列表使用逗號分隔,如 123 或 123,^456。尖號表示排除指定 PID
-R使用列 PPID 列出父進程的 PID
+|-r [T[mFMT]]控制 lsof 不斷重復(fù)執(zhí)行,間隔 T 秒,默認為 15s。-r 永遠不斷地執(zhí)行,直到收到中斷訊號(ctrl+ c),+r 一直執(zhí)行,直到?jīng)]有文件被顯示??蛇x的 mFMT 參數(shù)指定標記線的格式,格式 FMT 遵循 C 語言標準庫函數(shù) strftime(3) 的規(guī)范
-S [T]指定內(nèi)核函數(shù) lstat(2)、readlink(2) 和 stat(2) 的可選超時秒值,否則可能會死鎖。t 的最小值是 2;默認值是 15
-s [P:S]列出文件的大小,若該文件沒有大小,則留下空白。它導(dǎo)致 SIZE/OFF 輸出列標題更改為 SIZE。P 表示協(xié)議名稱 TCP or UDP,S 表示逗號分隔的協(xié)議狀態(tài)
-T [T]-T 沒有參數(shù)則禁用 TCP/TPI 信息報告。跟如下參數(shù),則顯示指定 TCP/TPI 信息:f 選擇報告套接字選項,狀態(tài)和值,以及 TCP標志和值q 選擇隊列長度s 選擇連接狀態(tài)w 選擇窗口大小
-t生成只有進程標識符而沒有標題的簡潔輸出,這樣輸出可以通過管道傳遞給 kill(1) 殺死
-U選擇 UNIX 域套接字文件的列表
-u USERS選擇登錄名或用戶 ID 位于逗號分隔集 USERS 中的用戶的文件列表。如 root 或 548,root”,如果用戶名或用戶 ID 前有尖號 ^,表示排除
-V指示被要求列出但找不到的項
-v顯示版本信息
+|-w啟用(+)或禁用(-)警告消息
-XLinux 下跳過所有打開的 TCP、UDP 和 UDPLITE IPv4 和 IPv6 文件的信息報告
-x [fl]一般與選項 +d 和 +D 選項,指示搜索時是否跨文件系統(tǒng)和符號鏈接。-x 不跟任何參數(shù)時,表示跨文件系統(tǒng)和符號鏈接
-Z [Z]指定如何處理 SELinux 安全上下文。當(dāng)在運行的 Linux 內(nèi)核中禁用SELinux時,Z 字段將被抑制輸出。-Z 選項不跟參數(shù),如 -Z -,安全上下文將列在 SECURITY-CONTEXT 列中輸出
--雙減號表示選項結(jié)束
NAMES列出指定文件,符號鏈接在使用前將被解析