天天看點

linux執行lsof指令_Linux lsof指令詳解

前言

最近又忙成狗,顧不上整理部落格了。今晚又要上線,趁着這個時間,趕緊寫點東西,把這篇文章總結一下吧。說到lsof指令,我第一次見它還是在2015年的3月份,那個時候剛剛入職亞信,給我配置設定了一個活,就是每天運作一個指定的腳本,統計某個程序打開oracle的連接配接數,後來看了下腳本,發現裡面就是一個簡單的lsof指令,那個時候也沒有去深究這個lsof到底怎麼用,反而到了今天,還要專門寫一篇文章來還當初欠下的技術債,哎~~~,廢話不多少,下面就開始lsof指令的總結。

指令簡介

我們都知道在Linux環境中,檔案無處不在,這便産生了一句格言:“任何事物都是檔案”。通過檔案不僅僅可以通路正常資料,通常還可以通路網絡連接配接和硬體。在有些情況下,當使用ls請求目錄清單時,将出現相應的條目。在其他情況下,如傳輸控制協定 (TCP) 和使用者資料報協定 (UDP)套接字,不存在相應的目錄清單。但是在背景為該應用程式配置設定了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用接口。

因為應用程式打開檔案的描述符清單提供了大量關于這個應用程式本身的資訊,是以能夠檢視這個清單将是很有幫助的。lsof作為Linux下的一個非常實用的系統級的監控、診斷工具,可以很完美的完成這項任務。由于lsof需要通路核心記憶體和各種檔案,是以最好使用root使用者運作lsof指令。

指令安裝

這是一個很尴尬的事情,這麼好用的工具,在很多Linux發行版上居然不是自帶的,在CentOS/Fedora/RHEL版本的Linux中則使用下面的指令進行安裝。

yum install lsof

指令詳解

lsof也是有着最多選項的Linux/Unix指令之一。lsof可以檢視打開的檔案是:

普通檔案

目錄

網絡檔案系統的檔案

字元或裝置檔案

(函數)共享庫

管道、命名管道

符号連結

網絡檔案(例如:NFS file、網絡socket,unix域名socket)

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

雖然lsof指令有着N多的選項,但是常用的隻有以下幾個:

-a:使用AND邏輯,合并選項輸出内容

-c:列出名稱以指定名稱開頭的程序打開的檔案

-d:列出打開指定檔案描述的程序

+d:列出目錄下被打開的檔案

+D:遞歸列出目錄下被打開的檔案

-n:列出使用NFS的檔案

-u:列出指定使用者打開的檔案

-p:列出指定程序号所打開的檔案

-i:列出打開的套接字

使用執行個體

總的說來,lsof指令還是一個比較複雜的指令,那麼多選項,用起來還是蠻累的,但是這不能否定它是一個出色的工具,一個我們不得不學習的指令。下面就來說一些lsof的慣用用法。

指令:lsof

輸出:

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME

systemd 1 root cwd DIR 253,1 4096 2 /

systemd 1 root rtd DIR 253,1 4096 2 /

systemd 1 root txt REG 253,1 1523568 1053845 /usr/lib/systemd/systemd

systemd 1 root mem REG 253,1 20040 1050452 /usr/lib64/libuuid.so.1.3.0

systemd 1 root mem REG 253,1 261336 1051899 /usr/lib64/libblkid.so.1.1.0

systemd 1 root mem REG 253,1 90664 1050435 /usr/lib64/libz.so.1.2.7

systemd 1 root mem REG 253,1 157424 1050447 /usr/lib64/liblzma.so.5.2.2

systemd 1 root mem REG 253,1 23968 1050682 /usr/lib64/libcap-ng.so.0.0.0

systemd 1 root mem REG 253,1 19888 1050666 /usr/lib64/libattr.so.1.1.0

輸出内容詳解:

COMMAND:程序的名稱

PID:程序辨別符

TID:線程辨別符

USER:程序所有者

FD:檔案描述符,應用程式通過檔案描述符識别該檔案,一般有以下取值:

cwd:表示current work dirctory,即:應用程式的目前工作目錄,這是該應用程式啟動的目錄

txt:該類型的檔案是程式代碼,如應用程式二進制檔案本身或共享庫

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

mmap:memory-mapped device

pd:parent directory

rtd:root directory

tr:kernel trace file (OpenBSD)

v86:VP/ix mapped file

0:表示标準輸出

1:表示标準輸入

2:表示标準錯誤

TYPE:檔案類型,常見的檔案類型有以下幾種:

DIR:表示目錄

CHR:表示字元類型

BLK:塊裝置類型

UNIX:UNIX域套接字

FIFO:先進先出(FIFO)隊列

IPv4:網際協定(IP)套接字

DEVICE:指定磁盤的名稱

SIZE/OFF:檔案的大小

NODE:索引節點(檔案在磁盤上的辨別)

NAME:打開檔案的确切名稱

指令:lsof abc.txt

說明:顯示開啟檔案abc.txt的程序

指令:lsof -i :80

說明:列出80端口目前打開的檔案清單

輸出:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

nginx 8838 root 8u IPv4 114512623 0t0 TCP *:http (LISTEN)

nginx 12886 jelly 8u IPv4 114512623 0t0 TCP *:http (LISTEN)

nginx 12887 jelly 8u IPv4 114512623 0t0 TCP *:http (LISTEN)

指令:lsof -i

說明:列出所有的網絡連接配接

輸出:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

ntpd 856 ntp 16u IPv4 13105 0t0 UDP *:ntp

ntpd 856 ntp 17u IPv6 13106 0t0 UDP *:ntp

ntpd 856 ntp 18u IPv4 13210 0t0 UDP localhost:ntp

ntpd 856 ntp 19u IPv4 13211 0t0 UDP jellythink:ntp

vsftpd 1613 root 3u IPv6 17867 0t0 TCP *:ftp (LISTEN)

php-fpm 4037 jelly 0u IPv4 60908335 0t0 TCP localhost:cslistener (LISTEN)

sshd 8503 root 3u IPv4 197060 0t0 TCP *:50022 (LISTEN)

nginx 8838 root 8u IPv4 114512623 0t0 TCP *:http (LISTEN)

nginx 8838 root 9u IPv4 114512624 0t0 TCP *:https (LISTEN)

php-fpm 9059 jelly 0u IPv4 60908335 0t0 TCP localhost:cslistener (LISTEN)

php-fpm 9137 jelly 0u IPv4 60908335 0t0 TCP localhost:cslistener (LISTEN)

指令:lsof -i tcp

說明:列出所有的TCP網絡連接配接資訊

指令:lsof -i udp

說明:列出所有的UDP網絡連接配接資訊

指令:lsof -i tcp:80

說明:列出80端口TCP協定的所有連接配接資訊

指令:lsof -i udp:25

說明:列出25端口UDP協定的所有連接配接資訊

指令:lsof -c ngin

說明:列出以ngin開頭的程序打開的檔案清單

指令:lsof -p 20711

說明:列出指定程序打開的檔案清單

指令:lsof -u uasp

說明:列出指定使用者打開的檔案清單

指令:lsof -u uasp -i tcp

說明:将所有的TCP網絡連接配接資訊和指定使用者打開的檔案清單資訊一起輸出

指令:lsof -a -u uasp -i tcp

說明:将指定使用者打開的檔案清單資訊,同時是TCP網絡連接配接資訊的一起輸出;注意和上一條指令進行對比

指令:lsof +d /usr/local/

說明:列出目錄下被程序打開的檔案清單

指令:lsof +D /usr/local/

說明:遞歸搜尋目錄下被程序打開的檔案清單

指令:lsof -i @peida.linux:20,21,22,25,53,80 -r 3

說明:列出目前連接配接到主機peida.linux上端口為20,21,22,25,53,80相關的所有檔案資訊,且每隔3秒不斷的執行lsof指令

總結

這快過年了,年底總是少不了一堆的聚餐,這篇文章也寫了好久,從12号寫到20号,好歹趁着這個周末,把它搞定了。說實話,這個指令我在平時工作中用的還真的比較少,我想,通過這篇總結,以後還真的離不開它了,我的工具箱中也多了一件寶貝,希望我總結的lsof指令對你有幫助,希望你喜歡。

果凍想,認真玩技術的地方。

2019年1月20日,于内蒙古呼和浩特。