Linux 命令之 lsof -- 列出当前系统已打开的文件列表
文章目錄
- 命令介紹
- 常用選項(xiàng)
- 字段說(shuō)明
- 文件類型
- 文件描述符
- 文件狀態(tài)模式
- 鎖模式
- 參考示例
- (一)查看打開(kāi)指定文件的所有進(jìn)程
- (二)列出由某個(gè) PID 對(duì)應(yīng)的進(jìn)程打開(kāi)的所有文件
- (三)查看指定名稱的進(jìn)程所打開(kāi)的文件列表
- (四)列出除了某個(gè)用戶以外的被打開(kāi)的文件列表
- (五)列出除了某個(gè)進(jìn)程之外,其它進(jìn)程打開(kāi)的文件列表
- (六)列出所有的網(wǎng)絡(luò)連接
- (七)列出所有的 TCP 網(wǎng)絡(luò)連接
- (八)列出所有的 UDP 網(wǎng)絡(luò)連接
- (九)查看有哪些進(jìn)程在使用指定的端口
- (十)查看哪些進(jìn)程在使用指定的 UDP 端口
- (十一)查看哪些進(jìn)程在使用指定的 TCP 端口
- (十二)列出某個(gè)用戶所有活躍的網(wǎng)絡(luò)端口
- (十三)查看指定用戶組所打開(kāi)的文件列表
- (十四)根據(jù)文件描述符的范圍查看有關(guān)的文件列表
- (十五)哪些進(jìn)程在使用 apache 的可執(zhí)行文件
- (十六)查看連接到某個(gè)遠(yuǎn)程主機(jī)端口的進(jìn)程
- (十七)不斷查看遠(yuǎn)程主機(jī) ftp 連接的情況
- (十八)遞歸查找某個(gè)目錄中所有打開(kāi)的文件
- (十九)列出某個(gè)用戶打開(kāi)的所有文件
- (二十)列出由某個(gè)用戶或某個(gè)進(jìn)程打開(kāi)的所有文件
- (二十一)查看某個(gè)用戶的所有網(wǎng)絡(luò)連接
- (二十二)列出所有內(nèi)存映射文件
- (二十三)列出所有加載在內(nèi)存中并正在執(zhí)行的進(jìn)程
- (二十四)查看使用網(wǎng)絡(luò)資源的進(jìn)程 pid
- (二十五)殺掉所有使用網(wǎng)絡(luò)的進(jìn)程
- (二十六)循環(huán)列出文件
- (二十七)查看被打開(kāi)的和網(wǎng)絡(luò)相關(guān)的文件
- (二十八)統(tǒng)計(jì)系統(tǒng)打開(kāi)的文件總數(shù)
- (二十九)殺掉屬于某個(gè)用戶的打開(kāi)了文件的所有進(jìn)程
- (三十)列出某個(gè) IP 的網(wǎng)絡(luò)連接信息
- (三十一)同時(shí)列出連接某主機(jī)多個(gè)端口的網(wǎng)絡(luò)連接文件
- 經(jīng)典場(chǎng)景應(yīng)用
- (一)查看指定進(jìn)程打開(kāi)的特定文件(查看日志文件路徑)
- (二)查看文件的內(nèi)存映射路徑(查看已刪除文件的內(nèi)容)
- (三)恢復(fù)被刪除的文件
- (四) 日志文件刪除后磁盤空間可用空間沒(méi)有變大,怎么解決
命令介紹
lsof 是 List Opened Files 的縮寫,該命令是用于列出當(dāng)前系統(tǒng)打開(kāi)的文件的工具,也就是查看被進(jìn)程打開(kāi)的文件的工具,且可以用來(lái)找回或恢復(fù)被刪除的文件。
在 Linux 下“一切皆文件”,任何事物都以文件的形式存在,包括但不限于 pipes, sockets, directories, devices等。通過(guò)文件不僅僅可以訪問(wèn)常規(guī)數(shù)據(jù),還可以訪問(wèn)網(wǎng)絡(luò)連接和硬件,例如:傳輸控制協(xié)議 (TCP) 和用戶數(shù)據(jù)報(bào)協(xié)議 (UDP) 套接字等。
lsof 是一個(gè) Linux 下的非常實(shí)用和方便的系統(tǒng)級(jí)的監(jiān)控、診斷工具。因?yàn)?lsof 命令需要訪問(wèn)核心內(nèi)存和各種文件,所以必須以 root 用戶的身份運(yùn)行它才能夠充分地發(fā)揮其功能。
系統(tǒng)在后臺(tái)為每個(gè)應(yīng)用程序分配了一個(gè)文件描述符(程序打開(kāi)文件,系統(tǒng)都會(huì)分配一個(gè)文件描述符給該程序),該文件描述符為應(yīng)用程序與基礎(chǔ)操作系統(tǒng)之間的交互提供了通用接口。因?yàn)閼?yīng)用程序打開(kāi)文件的描述符列表提供了大量關(guān)于這個(gè)應(yīng)用程序本身的信息,因此通過(guò) lsof 工具查看這個(gè)列表,對(duì)系統(tǒng)監(jiān)測(cè)以及排錯(cuò)將是很有幫助的。
在 lsof 顯示的結(jié)果中,每行顯示一個(gè)打開(kāi)的文件,若不指定條件默認(rèn)顯示所有進(jìn)程打開(kāi)的所有文件。
常用選項(xiàng)
| -a | 指示多個(gè)選項(xiàng)之間為 與 的關(guān)系,必須都滿足時(shí)才顯示結(jié)果 |
| -c<進(jìn)程名> | 列出指定進(jìn)程所打開(kāi)的文件 |
| -g | 顯示歸屬于 GID 的進(jìn)程情況 |
| -d<文件號(hào)> | 列出占用該文件號(hào)的進(jìn)程,文件號(hào)就是文件描述符。例如:顯示使用fd為4的進(jìn)程 |
| +d<目錄> | 列出指定目錄下被打開(kāi)的文件 |
| +D<目錄> | 遞歸列出指定目錄下被打開(kāi)的文件 |
| -n<目錄> | 列出使用NFS的文件 |
| -n | 不解析主機(jī)名 ,不將 IP 轉(zhuǎn)換為 Host Name,缺省是不加上 -n 選項(xiàng),疑問(wèn)?? |
| -i<條件> | 列出符合條件的且與網(wǎng)絡(luò)相關(guān)的進(jìn)程。(4、6、協(xié)議、:端口、 @ip )不加條件默認(rèn)列出所有的網(wǎng)絡(luò)連接。 |
| -p<進(jìn)程號(hào)> | 列出指定進(jìn)程號(hào)所打開(kāi)的文件 |
| -P | 不解析端口號(hào) |
| -N | 列出所有NFS(網(wǎng)絡(luò)文件系統(tǒng))文件 |
| -u<用戶名> | 列出指定用戶打開(kāi)的文件, 該選項(xiàng)可以指定用戶名 或 user ID,可以通過(guò)逗號(hào)分隔多個(gè)用戶名稱或 user ID,也可以通過(guò)符號(hào) ^ 對(duì)條件取反 |
| -U | 列出所有UNIX域Socket文件 |
| -t | 只輸出 PID |
| -h | 顯示幫助信息 |
| -v | 顯示版本信息 |
字段說(shuō)明
| COMMAND | 進(jìn)程的名稱,默認(rèn)以 9 個(gè)字符長(zhǎng)度顯示的命令名稱。可使用 +c 參數(shù)指定顯示的寬度,若 +c 后跟的參數(shù)為零,則顯示命令的全名。這個(gè) +c 參數(shù)好像無(wú)效 |
| PID | 進(jìn)程標(biāo)識(shí)符 |
| PPID | 父進(jìn)程標(biāo)識(shí)符,父進(jìn)程的IP號(hào),默認(rèn)不顯示,當(dāng)使用 -R 參數(shù)可打開(kāi)。 |
| USER | 進(jìn)程所有者,命令的執(zhí)行 UID 或系統(tǒng)中登陸的用戶名稱。默認(rèn)顯示為用戶名,當(dāng)使用 -l 參數(shù)時(shí),可顯示 UID。 |
| PGID | 進(jìn)程所屬組標(biāo)識(shí)符,進(jìn)程組的ID 編號(hào),默認(rèn)也不會(huì)顯示,當(dāng)使用 -g 參數(shù)時(shí)可打開(kāi)。 |
| FD | File Descriptor Number,文件描述符,應(yīng)用程序通過(guò)文件描述符識(shí)別文件,例如:cwd、txt 等 |
| TYPE | 文件類型,例如: DIR、REG 等 |
| DEVICE | 指定磁盤的名稱,以逗號(hào)分隔設(shè)備編號(hào),使用character special、block special表示的設(shè)備號(hào) |
| SIZE | 文件的大小,如果不能用大小表示的,會(huì)留空。使用-s參數(shù)控制。 |
| NODE | 索引節(jié)點(diǎn)(文件在磁盤上的標(biāo)識(shí)),本地文件的node碼,或者協(xié)議,如TCP等 |
| NAME | 打開(kāi)文件的確切名稱,掛載點(diǎn)和文件的全路徑(鏈接會(huì)被解析為實(shí)際路徑),或者連接雙方的地址和端口、狀態(tài)等 |
文件類型
| REG | 普通文件 |
| DIR | 表示目錄 |
| CHR | 表示字符類型 |
| BLK | 塊設(shè)備類型 |
| UNIX | UNIX 域套接字,UNIX Domain Sockets |
| FIFO | 先進(jìn)先出 (FIFO) 隊(duì)列 |
| IPv4/IPv6 | 網(wǎng)際協(xié)議 (IP) 套接字,IPv4/IPv6 套接字 |
| LINK | 鏈接文件 |
文件描述符
| cwd | Current Work Director 的縮寫,應(yīng)用程序的當(dāng)前工作目錄,這是該應(yīng)用程序啟動(dòng)的目錄,除非它本身對(duì)這個(gè)目錄進(jìn)行更改 |
| txt | 該類型的文件是程序代碼,表示程序的可執(zhí)行文件 |
| lnn | library references (AIX) |
| er | FD information error (see NAME column) |
| jld | jail directory (FreeBSD) |
| ltx | shared library text (code and data) |
| mxx | hex memory-mapped type number xx |
| m86 | DOS Merge mapped file |
| mem | memory-mapped file,表示內(nèi)存映射文件 |
| mmap | memory-mapped device |
| pd | parent directory |
| rtd | root directory,表示根目錄 |
| tr | kernel trace file (OpenBSD) |
| v86 | VP/ix mapped file |
| 0 | 表示標(biāo)準(zhǔn)輸出 |
| 1 | 表示標(biāo)準(zhǔn)輸入 |
| 2 | 表示標(biāo)準(zhǔn)錯(cuò)誤 |
文件狀態(tài)模式
一般在標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤、標(biāo)準(zhǔn)輸入后還跟著文件狀態(tài)模式。
| u | 表示該文件被打開(kāi)并處于讀取/寫入模式,例如:10u,10 是打開(kāi)該文件時(shí)返回的一個(gè)整數(shù),表示文件號(hào)是10,u 表示該文件被打開(kāi)且處于讀取/寫入模式 |
| r | 表示該文件被打開(kāi)并處于只讀模式 |
| w | 表示該文件被打開(kāi)并處于只寫模式 |
| space | 表示該文件的狀態(tài)模式為 unknow,且沒(méi)有鎖定 |
| - | 表示該文件的狀態(tài)模式為 unknow,且被鎖定 |
鎖模式
在文件狀態(tài)模式后面,還跟著相關(guān)的鎖:
| N | for a Solaris NFS lock of unknown type |
| r | for read lock on part of the file |
| R | for a read lock on the entire file |
| w | for a write lock on part of the file(文件的部分寫鎖) |
| W | for a write lock on the entire file(整個(gè)文件的寫鎖)。表示該應(yīng)用程序擁有對(duì)整個(gè)文件的寫鎖(表示該進(jìn)程擁有對(duì)文件寫操作的鎖),該文件描述符用于確保每次只能打開(kāi)一個(gè)應(yīng)用程序?qū)嵗3跏即蜷_(kāi)每個(gè)應(yīng)用程序時(shí),都具有三個(gè)文件描述符,從 0 到 2,分別表示標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。所以大多數(shù)應(yīng)用程序所打開(kāi)的文件的 FD 都是從 3 開(kāi)始。 |
| u | for a read and write lock of any length |
| U | for a lock of unknown type |
| x | for an SCO OpenServer Xenix lock on part of the file |
| X | for an SCO OpenServer Xenix lock on the entire file |
| space | if there is no lock。表示該文件的狀態(tài)模式為 unknow,且沒(méi)有鎖定。 |
| - | 表示該文件的狀態(tài)模式為 unknow,且被鎖定。 |
參考示例
(一)查看打開(kāi)指定文件的所有進(jìn)程
(二)列出由某個(gè) PID 對(duì)應(yīng)的進(jìn)程打開(kāi)的所有文件
查看 PID 為 1064381 的進(jìn)程所打開(kāi)的全部文件列表:
[root@htlwk0001host ~]# lsof -p 1064381 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1064381 mysql cwd DIR 253,1 4096 636744 /var/lib/mysql mysqld 1064381 mysql rtd DIR 253,1 244 128 / mysqld 1064381 mysql txt REG 253,1 251816000 51228705 /usr/sbin/mysqld mysqld 1064381 mysql mem REG 253,1 553480 50342901 /usr/lib64/libpcre2-8.so.0.7.1 mysqld 1064381 mysql mem REG 253,1 304848 50342907 /usr/lib64/libselinux.so.1(三)查看指定名稱的進(jìn)程所打開(kāi)的文件列表
查看進(jìn)程 mysqld 所打開(kāi)的全部文件列表:
[root@htlwk0001host ~]# lsof -c mysqld COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1064381 mysql cwd DIR 253,1 4096 636744 /var/lib/mysql mysqld 1064381 mysql rtd DIR 253,1 244 128 / mysqld 1064381 mysql txt REG 253,1 251816000 51228705 /usr/sbin/mysqld mysqld 1064381 mysql mem REG 253,1 553480 50342901 /usr/lib64/libpcre2-8.so.0.7.1 mysqld 1064381 mysql mem REG 253,1 304848 50342907 /usr/lib64/libselinux.so.1 mysqld 1064381 mysql mem REG 253,1 33224 50343274 /usr/lib64/libuuid.so.1.3.0-c 選項(xiàng)限定只列出以 mysqld 開(kāi)頭的進(jìn)程打開(kāi)的文件:
你同樣可以制定多個(gè) -c 參數(shù):
[root@htlwk0001host ~]# lsof -c apache -c python這會(huì)列出所有由 apache 和 python 打開(kāi)的文件。
(四)列出除了某個(gè)用戶以外的被打開(kāi)的文件列表
[root@htlwk0001host ~]# lsof -u ^root COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME polkitd 715 polkitd cwd DIR 253,1 244 128 / polkitd 715 polkitd rtd DIR 253,1 244 128 /說(shuō)明:^ 符號(hào),表示 取反 的意思。
(五)列出除了某個(gè)進(jìn)程之外,其它進(jìn)程打開(kāi)的文件列表
[root@htlwk0001host ~]# lsof -p ^1234(六)列出所有的網(wǎng)絡(luò)連接
列出所有打開(kāi)了網(wǎng)絡(luò)套接字(TCP和UDP)的進(jìn)程:
[root@htlwk0001host ~]# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chronyd 743 chrony 5u IPv4 20334 0t0 UDP localhost:323 chronyd 743 chrony 6u IPv6 20335 0t0 UDP localhost:323 NetworkMa 901 root 24u IPv4 22817 0t0 UDP htlwk0001host:bootpc->_gateway:bootps systemd-r 955 systemd-resolve 12u IPv4 23063 0t0 UDP *:hostmon systemd-r 955 systemd-resolve 13u IPv4 23064 0t0 TCP *:hostmon (LISTEN)(七)列出所有的 TCP 網(wǎng)絡(luò)連接
[root@htlwk0001host ~]# lsof -i tcp COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-r 955 systemd-resolve 13u IPv4 23064 0t0 TCP *:hostmon (LISTEN) systemd-r 955 systemd-resolve 15u IPv6 23067 0t0 TCP *:hostmon (LISTEN) nginx 26556 root 8u IPv4 137518 0t0 TCP *:http (LISTEN) nginx 26556 root 9u IPv4 137519 0t0 TCP *:https (LISTEN) nginx 26556 root 10u IPv6 137520 0t0 TCP *:https (LISTEN) nginx 26556 root 11u IPv6 137521 0t0 TCP *:http (LISTEN) svnserve 34295 root 3u IPv4 182743 0t0 TCP *:svn (LISTEN) httpd 34871 root 4u IPv6 186113 0t0 TCP *:tproxy (LISTEN)tcp 選項(xiàng)會(huì)強(qiáng)制 lsof 只列出打開(kāi) TCP sockets 的進(jìn)程。
(八)列出所有的 UDP 網(wǎng)絡(luò)連接
[root@htlwk0001host ~]# lsof -i udp COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chronyd 743 chrony 5u IPv4 20334 0t0 UDP localhost:323 chronyd 743 chrony 6u IPv6 20335 0t0 UDP localhost:323 NetworkMa 901 root 24u IPv4 22817 0t0 UDP htlwk0001host:bootpc->_gateway:bootps systemd-r 955 systemd-resolve 12u IPv4 23063 0t0 UDP *:hostmon systemd-r 955 systemd-resolve 14u IPv6 23066 0t0 UDP *:hostmon systemd-r 955 systemd-resolve 18u IPv4 23069 0t0 UDP 127.0.0.53:domain(九)查看有哪些進(jìn)程在使用指定的端口
讓 lsof 列出占用 TCP 或 UDP 的 3306 端口的進(jìn)程:
[root@htlwk0001host ~]# lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1050299 root 72u IPv6 19427946 0t0 TCP htlwk0001host:60664->47.114.59.224:mysql (ESTABLISHED) java 1050299 root 78u IPv6 19427982 0t0 TCP htlwk0001host:60704->47.114.59.224:mysql (ESTABLISHED) java 1050299 root 79u IPv6 19427963 0t0 TCP htlwk0001host:60684->47.114.59.224:mysql (ESTABLISHED) java 1050299 root 80u IPv6 19427972 0t0 TCP htlwk0001host:60696->47.114.59.224:mysql (ESTABLISHED)你也可以使用 /etc/services 中制定的端口名稱來(lái)代替端口號(hào),比如:
[root@htlwk0001host ~]# lsof -i :smtp(十)查看哪些進(jìn)程在使用指定的 UDP 端口
[root@htlwk0001host ~]# lsof -i udp:55(十一)查看哪些進(jìn)程在使用指定的 TCP 端口
[root@htlwk0001host ~]# lsof -i tcp:55(十二)列出某個(gè)用戶所有活躍的網(wǎng)絡(luò)端口
[root@htlwk0001host ~]# lsof -a -u test -i(十三)查看指定用戶組所打開(kāi)的文件列表
查找所有 PGID 為 5555 的進(jìn)程打開(kāi)的文件:
[root@htlwk0001host ~]# lsof -g 5555;(十四)根據(jù)文件描述符的范圍查看有關(guān)的文件列表
上面的命令會(huì)列出所有描述符為 2 或 3 的文件。
上面這個(gè)命令會(huì)列出所有以描述符 4 打開(kāi)的文件。
(十五)哪些進(jìn)程在使用 apache 的可執(zhí)行文件
[root@htlwk0001host ~]# lsof `which httpd` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 34871 root txt REG 253,1 580064 53187782 /usr/sbin/httpd httpd 1048930 apache txt REG 253,1 580064 53187782 /usr/sbin/httpd httpd 1048931 apache txt REG 253,1 580064 53187782 /usr/sbin/httpd httpd 1049032 apache txt REG 253,1 580064 53187782 /usr/sbin/httpd httpd 1049033 apache txt REG 253,1 580064 53187782 /usr/sbin/httpd httpd 1049411 apache txt REG 253,1 580064 53187782 /usr/sbin/httpd(十六)查看連接到某個(gè)遠(yuǎn)程主機(jī)端口的進(jìn)程
lsof -n 不將IP轉(zhuǎn)換為hostname,缺省是不加上-n參數(shù)。
(十七)不斷查看遠(yuǎn)程主機(jī) ftp 連接的情況
[root@htlwk0001host ~]# lsof -i tcp@www.dpqyw.com:ftp -r -n ======= ======= =======說(shuō)明:
(十八)遞歸查找某個(gè)目錄中所有打開(kāi)的文件
[root@htlwk0001host ~]# lsof +D /usr/lib加上+D 參數(shù),lsof 會(huì)對(duì)指定目錄進(jìn)行遞歸查找,注意這個(gè)參數(shù)要比 grep 版本慢:
[root@htlwk0001host ~]# lsof | grep '/usr/lib'之所以慢是因?yàn)?#43;D首先查找所有的文件,然后一次性輸出。
(十九)列出某個(gè)用戶打開(kāi)的所有文件
[root@htlwk0001host ~]# lsof -u liaowenxiong-u 選項(xiàng)限定只列出所有被用戶 liaowenxiong 打開(kāi)的文件,你可以通過(guò)逗號(hào)指定多個(gè)用戶:
[root@htlwk0001host ~]# lsof -u liaowenxiong,liudehua這條命令會(huì)列出 liaowenxiong 和 liudehua 用戶打開(kāi)的所有文件。
你也可以像下面這樣使用多個(gè) -u 做同樣的事情:
[root@htlwk0001host ~]# lsof -u liaowenxiong -u root(二十)列出由某個(gè)用戶或某個(gè)進(jìn)程打開(kāi)的所有文件
[root@htlwk0001host ~]# lsof -u pkrumins -c apache你可以組合使用多個(gè)選項(xiàng),這些選項(xiàng)默認(rèn)進(jìn)行 或 關(guān)聯(lián),也就是說(shuō)上面的命令會(huì)輸出由用戶 pkrumins 或者進(jìn)程 apache 打開(kāi)的文件,若希望多個(gè)選項(xiàng)之間是 與 關(guān)聯(lián),可用加上選項(xiàng) -a。
(二十一)查看某個(gè)用戶的所有網(wǎng)絡(luò)連接
查看用戶 root 的所有網(wǎng)絡(luò)連接:
[root@htlwk0001host ~]# lsof -a -u root -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME NetworkMa 901 root 24u IPv4 22817 0t0 UDP htlwk0001host:bootpc->_gateway:bootps nginx 26556 root 8u IPv4 137518 0t0 TCP *:http (LISTEN) nginx 26556 root 9u IPv4 137519 0t0 TCP *:https (LISTEN) nginx 26556 root 10u IPv6 137520 0t0 TCP *:https (LISTEN)使用 -a 將 -u 和 -i 選項(xiàng)組合可以讓 lsof 列出某個(gè)用戶的所有網(wǎng)絡(luò)行為。
(二十二)列出所有內(nèi)存映射文件
[root@htlwk0001host ~]# lsof -d mem(二十三)列出所有加載在內(nèi)存中并正在執(zhí)行的進(jìn)程
[root@htlwk0001host ~]# lsof -d txt(二十四)查看使用網(wǎng)絡(luò)資源的進(jìn)程 pid
[root@htlwk0001host ~]# lsof -t -i-t 選項(xiàng)輸出進(jìn)程的 PID,你可以將它和 -i 選項(xiàng)組合輸出使用某個(gè)端口的進(jìn)程的 PID,如下:
[root@htlwk0001host ~]# lsof -t -i:3306 1050299 1050398 1064381(二十五)殺掉所有使用網(wǎng)絡(luò)的進(jìn)程
[root@htlwk0001host ~]# kill -9 'lsof -t -i'(二十六)循環(huán)列出文件
[root@htlwk0001host ~]# lsof -r 1-r 選項(xiàng)讓 lsof 可以循環(huán)列出文件直到被中斷,參數(shù)1 就是循環(huán)間隔時(shí)間是 1 秒,即循環(huán)周期是 1 秒,意思是每秒鐘重復(fù)打印一次,這個(gè)選項(xiàng)最好同某個(gè)范圍比較小的查詢組合使用,比如用來(lái)監(jiān)測(cè)用戶的網(wǎng)絡(luò)活動(dòng):
[root@htlwk0001host ~]# lsof -r 1 -u john -i -a(二十七)查看被打開(kāi)的和網(wǎng)絡(luò)相關(guān)的文件
使用 -i 選項(xiàng)用來(lái)查看網(wǎng)絡(luò)相關(guān)的文件,其參數(shù)的格式如下:
lsof -i [46][protocol][@hostname|hostaddr][:service|port]說(shuō)明:
-i 選項(xiàng)默認(rèn)會(huì)同時(shí)輸出 IPv4 和 IPv6 打開(kāi)的文件。
(二十八)統(tǒng)計(jì)系統(tǒng)打開(kāi)的文件總數(shù)
[root@htlwk0001host ~]# lsof -P -n | wc -l 69360命令中的 -P 選項(xiàng)表示不解析端口號(hào),-n 選項(xiàng)表示不解析主機(jī)名,這兩個(gè)選項(xiàng)主要的目的是為了提升 lsof 命令的執(zhí)行速度。wc -l 命令則用來(lái)統(tǒng)計(jì) lsof 命令輸出的行數(shù)。
(二十九)殺掉屬于某個(gè)用戶的打開(kāi)了文件的所有進(jìn)程
[root@htlwk0001host ~]# kill -9 `lsof -t -u nick` [root@htlwk0001host ~]# kill -9 $(lsof -t -u nick)(三十)列出某個(gè) IP 的網(wǎng)絡(luò)連接信息
[root@htlwk0001host ~]# lsof -i @47.114.59.256 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1050299 root 72u IPv6 19473546 0t0 TCP htlwk0001host:36448->47.114.59.224:mysql (ESTABLISHED) java 1050299 root 78u IPv6 19472650 0t0 TCP htlwk0001host:36488->47.114.59.224:mysql (ESTABLISHED) java 1050299 root 79u IPv6 19473549 0t0 TCP htlwk0001host:36450->47.114.59.224:mysql (ESTABLISHED)(三十一)同時(shí)列出連接某主機(jī)多個(gè)端口的網(wǎng)絡(luò)連接文件
列出目前連接主機(jī) hadoop 的端口為:20,21,22,25,53,80 的所有文件信息,且每隔3秒不斷的執(zhí)行 lsof 指令:
[root@htlwk0001host ~]# lsof -i @hadoop:20,21,22,25,53,80 -r 3經(jīng)典場(chǎng)景應(yīng)用
(一)查看指定進(jìn)程打開(kāi)的特定文件(查看日志文件路徑)
場(chǎng)景描述:
同事今天請(qǐng)假了,但負(fù)責(zé)的 webserver 服務(wù)出現(xiàn)了問(wèn)題,老板讓你看一下 webserver 服務(wù)的日志,但你不知道 webserver 服務(wù)的日志文件路徑,配置文件太復(fù)雜你不太懂,這時(shí)你可以執(zhí)行以下命令查看日志文件路徑。
[devl@xungen ~]$ lsof -c webserver | grep -e 'log$' webserver 10124 devl 4u REG 253,1 8814787 109523 /home/devl/application/webserver/log/webserver.00.log(二)查看文件的內(nèi)存映射路徑(查看已刪除文件的內(nèi)容)
場(chǎng)景描述:
新來(lái)的同事誤刪除了 webserver 服務(wù)的日志文件,現(xiàn)在線上環(huán)境出現(xiàn)問(wèn)題,需要查看 webserver 的日志,老板讓緊急處理一下,這時(shí)你只能通過(guò)日志文件的內(nèi)存映射路徑來(lái)查看日志內(nèi)容,那么怎么獲取文件的內(nèi)存映射路徑呢?你要記住內(nèi)存映射路徑的固定格式:/proc/進(jìn)程ID/fd/句柄。接著你要知道 webserver 進(jìn)程 ID 和日志文件的句柄,那么這時(shí)我們就可以使用命令 lsof,來(lái)查看進(jìn)程ID和文件句柄了。
注意:文件句柄又叫文件描述符又叫文件號(hào)
[devl@xungen ~]$ lsof -c webserver | grep -e 'log$' webserver 10124 devl 4u REG 253,1 8814787 109523 /home/devl/application/webserver/log/webserver.00.log以上的執(zhí)行結(jié)果顯示 webserver 服務(wù)的進(jìn)程 ID 為 10124,日志文件句柄為 4u(即 4 號(hào)句柄),所以 /proc/10124/fd/4 就是日志文件(webserver.00.log)在 webserver 進(jìn)程中的內(nèi)存映射路徑,這時(shí)你用 tail 命令就可查看日志文件了。
[devl@xungen ~]$ tail -f /proc/10124/fd/4 [20190602 09:51:04|INF] start route ping process success [20190602 09:51:04|INF] ping host[127.0.0.1:8888][3951] success [20190602 09:51:09|INF] check session success [20190602 09:51:09|INF] start route ping process success [20190602 09:51:09|INF] ping host[127.0.0.1:8888][3596] success [20190602 09:51:14|INF] start route ping process success [20190602 09:51:14|INF] ping host[127.0.0.1:8888][3390] success [20190602 09:51:19|INF] start route ping process success [20190602 09:51:19|INF] ping host[127.0.0.1:8888][3383] success [20190602 09:51:19|INF] check session success擴(kuò)展知識(shí):
當(dāng)進(jìn)程打開(kāi)了某個(gè)文件時(shí),只要該進(jìn)程保持打開(kāi)該文件,即使將其刪除,它依然存在于磁盤中。這意味著,進(jìn)程并不知道文件已經(jīng)被刪除,它仍然可以向打開(kāi)該文件時(shí)提供給它的文件描述符進(jìn)行讀取和寫入。除了該進(jìn)程之外,這個(gè)文件是不可見(jiàn)的,因?yàn)橐呀?jīng)刪除了其相應(yīng)的目錄索引節(jié)點(diǎn)。 在 /proc 目錄下存儲(chǔ)著反映內(nèi)核和進(jìn)程樹(shù)的各種文件。/proc 目錄掛載的是在內(nèi)存中所映射的一塊區(qū)域,所以這些文件和目錄并不存在于磁盤中,因此當(dāng)我們對(duì)這些文件進(jìn)行讀取和寫入時(shí),實(shí)際上是從內(nèi)存中獲取相關(guān)信息。大多數(shù)與 lsof 相關(guān)的信息都存儲(chǔ)于以進(jìn)程 ID 命名的目錄中,例如: /proc/1234 中存儲(chǔ)的是 PID 為 1234 的進(jìn)程的信息。每個(gè)進(jìn)程目錄中存儲(chǔ)著各種文件,它們可以使得應(yīng)用程序簡(jiǎn)單地了解進(jìn)程的內(nèi)存空間、文件描述符列表、指向磁盤上的文件的符號(hào)鏈接和其他系統(tǒng)信息。
(三)恢復(fù)被刪除的文件
當(dāng)系統(tǒng)中的某個(gè)文件被意外地刪除了,只要這個(gè)時(shí)候系統(tǒng)中還有進(jìn)程正在訪問(wèn)該文件,那么我們就可以通過(guò) lsof 從 /proc 目錄下恢復(fù)該文件的內(nèi)容。 假如,由于誤操作將 /var/log/messages 文件刪除掉了,那么這時(shí)要將 /var/log/messages 文件恢復(fù)的方法如下:
首先使用 lsof 來(lái)查看當(dāng)前是否有進(jìn)程打開(kāi) /var/logmessages 文件,如下:
[root@htlwk0001host ~]# lsof |grep /var/log/messages syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)從上面的信息可以看到進(jìn)程 syslogd(PID=1283)打開(kāi)文件的文件描述符為 2w。同時(shí)還可以看到 /var/log/messages 已經(jīng)標(biāo)記被刪除了。因此我們可以在 /proc/1283/fd/2 中查看相應(yīng)的信息,如下:
[root@htlwk0001host ~]# 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)如果可以通過(guò)文件描述符查看相應(yīng)的數(shù)據(jù),那么就可以使用 I/O 重定向?qū)⑵鋸?fù)制到文件中,命令語(yǔ)句如下:
[root@htlwk0001host ~]# cat /proc/1283/fd/2 > /var/log/messages或者
[root@htlwk0001host ~]# sh -c 'cat /proc/1283/fd/2 > /var/log/messages'然后修復(fù)文件的權(quán)限屬性并重啟 rsyslog 服務(wù):
[root@htlwk0001host ~]# chown messages:adm /var/log/messages [root@htlwk0001host ~]# systemctl restart rsyslog.service這樣就完成了 /var/log/messages 文件的恢復(fù)工作。對(duì)于許多應(yīng)用程序,尤其是日志文件和數(shù)據(jù)庫(kù),這種恢復(fù)刪除文件的方法非常有用。
(四) 日志文件刪除后磁盤空間可用空間沒(méi)有變大,怎么解決
發(fā)現(xiàn)文件系統(tǒng) /tmp 目錄下空間居然用滿了,但用 du 命令統(tǒng)計(jì) /tmp 目錄中所有文件的大小,發(fā)現(xiàn)并沒(méi)有大文件,怎么回事呢?出現(xiàn)這樣的情況,很有可能是被刪除的大文件依舊有其它程序在使用,所以依舊占用著磁盤空間,只是我們正常的方式無(wú)法查看到此文件,換句話說(shuō)就是文件沒(méi)有被徹底刪除,這時(shí)候我們可以使用命令 lsof 求證下 。
步驟 1:查看系統(tǒng)磁盤的使用情況
[root@htlwk0001host ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.6G 1.5G 6.7G 18% / /dev/sda10 784G 325G 420G 44% /u01 /dev/sda5 8.7G 7.9G 407M 96% /tmp /dev/sda2 15G 2.8G 11G 21% /usr /dev/sda1 122M 12M 104M 10% /boot tmpfs 7.9G 4.0K 7.9G 1% /dev/shm如上所示,/tmp 可用空剩下 407M。
步驟 2:使用命令 lsof 查看正在被進(jìn)程使用的與 /tmp 相關(guān)的文件
[root@htlwk0001host ~]# sudo lsof | grep /tmp sleep 18833 peien.htg 1w REG 8,5 8321143673 54 /tmp/netstat.log (deleted) netstat_2 13571 peien.htg 1w REG 8,5 8321143673 54 /tmp/netstat.log (deleted) tcprstat 18823 root 2w REG 8,5 43632 49 /tmp/myrt.daemon.log sh 18822 mysql 2w REG 8,5 43632 49 /tmp/myrt.daemon.log sh 18822 mysql 1w REG 8,5 43632 49 /tmp/myrt.daemon.log myrt.pl 26045 mysql 2w REG 8,5 43632 49 /tmp/myrt.daemon.log myrt.pl 26045 mysql 1w REG 8,5 43632 49 /tmp/myrt.daemon.log check_age 25298 mysql 2w REG 8,5 22049 33 /tmp/check_agent.log check_age 25298 mysql 1w REG 8,5 22049 33 /tmp/check_agent.log mysqld 3784 mysql 6u REG 8,5 15156 13 /tmp/ibH3IFN9 (deleted)如上所示列表中的第二行,文件大小7個(gè)多G,文件標(biāo)記已刪,但是依舊被進(jìn)程“netstat_2”占用,該進(jìn)程的 PID=13571。
步驟 3: 我們可以使用命令 ps 查看進(jìn)程更為詳細(xì)的信息
[root@htlwk0001host ~]# ps -ef | grep 13571 51717 13571 1 0 2011 ? 00:15:00 /bin/bash /tmp/netstat_20110829.sh 51717 21456 13571 0 09:40 ? 00:00:00 sleep 10 zhuxu 21458 17014 0 09:40 pts/0 00:00:00 grep 13571步驟 4:接著我們將此進(jìn)程 kill 掉
[root@htlwk0001host ~]# sudo kill -9 13571步驟 5:然后我們?cè)倏纯茨莻€(gè)已刪的文件是否被進(jìn)程占用著
[root@htlwk0001host ~]# sudo lsof | grep /tmp tcprstat 22084 root 2w REG 8,5 49339 49 /tmp/myrt.daemon.log sh 22083 mysql 2w REG 8,5 49339 49 /tmp/myrt.daemon.log sh 22083 mysql 1w REG 8,5 49339 49 /tmp/myrt.daemon.log myrt.pl 26045 mysql 2w REG 8,5 49339 49 /tmp/myrt.daemon.log myrt.pl 26045 mysql 1w REG 8,5 49339 49 /tmp/myrt.daemon.log check_age 25298 mysql 2w REG 8,5 24583 33 /tmp/check_agent.log check_age 25298 mysql 1w REG 8,5 24583 33 /tmp/check_agent.log mysqld 3784 mysql 6u REG 8,5 15156 13 /tmp/ibH3IFN9 (deleted) su 17013 root cwd DIR 8,5 4096 2 /tmp sort 22090 zhuxu cwd DIR 8,5 4096 2 /tmp如上所示結(jié)果,看不到那個(gè)已刪的大文件了。
步驟 6:我們?cè)倏纯聪到y(tǒng)磁盤分區(qū)的使用情況,確認(rèn)下 /tmp 的使用空間是否增加了
[root@htlwk0001host ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.6G 1.5G 6.7G 18% / /dev/sda10 784G 325G 420G 44% /u01 /dev/sda5 8.7G 56M 8.2G 1% /tmp /dev/sda2 15G 2.8G 11G 21% /usr /dev/sda1 122M 12M 104M 10% /boot tmpfs 7.9G 4.0K 7.9G 1% /dev/shm如上所示,目錄 /tmp 的可用空間變成 8.2G 了。
總結(jié)
以上是生活随笔為你收集整理的Linux 命令之 lsof -- 列出当前系统已打开的文件列表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安卓卸载大师下载(安卓卸载大师)
- 下一篇: Linux 命令之 du -- 显示每个