options

如果直接呼叫『lsof』而沒有加任何參數的話,它將會列出所有已經啟動的行程的開啟檔案。

如果你已經有指定某個Option了,則其他的資訊就必須要在特別指定,否則不會顯示,舉個例子來說,假設你已經指定『-U (Unix socket files)』了,除非你在指定『-N』,否則NFS檔案並不會被顯示出來。又或者假設你已經指定『-u (Unix domain files)』,除非你在具體指定『-U』,不然相關的資訊也不會被顯示出來。

-a

讓所有已經被指定的list options被聯集『ANDed』起來。

-A AAA

可以允許lsof使用者具體指定『AAA』來當成動態模組在kernel addresses上可能找到的替代名稱。這個option必須要在對於AFS的系統組態有經過動態模組來實做才能用。

-b

避免lsof用一些會造成block的kernel函數,像是『lstat(2)』,『readlink(2)』,『stat(2)』。

-c ccc

選擇檔案清單來處理命令的開頭是字元『ccc』的。如果有多個命令的話可以用多個『-c』來指定,這樣他們在被加到一個聯集之前都會被加到一個『ORed set』裡面。

如果『ccc』是以『^』開始的話,則接下來的命令都會被忽略

如果『ccc』開頭跟結尾都是『/』的話,則在中間的字元都會被當成正規表示法(regular expression)。shell相關的關鍵字(Shell Metacharacters)要記得用單引號刮起來,否則會被shell給當成特殊字元給處理掉。如果要用『/』的話,後面的那個『closing slash』可以有底下三個modifiers:

b 這個正規表示法『regular expression』是一般的。
i 忽略大小寫。
x 使用進階的正規表示法『extended regular expression』,這是預設。

一般來說,基本的命令指定(simple command specification)會被先測試,如果測試失敗的話,則命令正規表示法(command regular expression)就會被套用。如果測試成功的話,相對而言當然命令正規表示法就不會被套用,並且會產生一個訊息-『no command found for regex:』,當然,這是要具體使用option『-V』才能看到的。

+c w

這個option定義了命令名字的初始字元的最大值,主要是提供給UNIX-like的系統用的,讓UNIX-like上跟行程上的繫結命令被印在欄位『COMMAND』上(lsof的預設最大值是9)。

一般來說,在許多UNIX-like的系統上,lsof取得的命令名稱並不是毫無修飾的就全部顯示,舉個例子來說,在Linux 2.4.27和Solaris 9上都將名字的長度給限制在16個字元。

如果『w』被指定為『0』,所有提供給lsof的命令都將會被列印出來。 如果『w』的長度比欄位的長度還要少的話,則欄位『COMMAND』將會被延伸到這個長度。

-C

這是大C,代表取消從kernel的name cache裡面回報的path name components。

+d s

讓lsof去搜尋資料夾『s』的所有開啟的實體和在最上層所包含的資料夾,『+d』並不會往下到子資料夾,而是只會到『s』的root。如果要整個tree的搜尋的話,可以用『+D』。

對於連結檔,『+d』並不會去處理相關的連結檔,除非你有特別指定『-x』或是『-x l』,還有掛載點(mount point)也是,如果你沒有特別指定『-x』或是『-x f』的話,lsof不會幫你搜尋掛載點裡面的檔案系統資料的。

這個option的使用者權限會被限制在使用者對這個檔案使用指令『stat』的權限。

-d s

具體指定某些檔案描述子(File Descriptors)來包含或是排除在輸出清單中。這些檔案描述子會被『,』所隔開來當成一個集合,舉個例子來說『’’cwd,1,3’’』,『’’^6,^2’’』就是兩個集合,而且每個集合裡面要注意不能有空白字符。在參與其他的AND處理之前,多重的檔案描述子編號將會被包含在一個『ORed』裡。

如果前面加個『^』的話就代表是排除的意思『exclusion』的意思,那相對而言,沒有『^』的話當然就是包含的意思,而且同一個集合裡面這兩個是不能被混用的,混用的話會有error。

除了用逗號隔開以外,檔案描述子還可以用範圍的用法,舉個例子來說『’’0-7’’』和『’’3-10’’』,後面的數字一定要比前面的大,範圍的用法也可以用在排除語法上,一樣前面加個『^』就好,像是『’’^0-7’’』,排除檔案描述子0到7。

+D DD

讓lsof去搜尋資料夾DD底下的所有實體,並且還有其相關的子資料夾和檔案們。和『+d』主要的差別就只是會不會遞迴下去子資料夾而已。

而連結和掛載點的問題也跟『+d』一樣,要透過『-x』,『-x l』和『-x f』來處理。權限的部份也一樣,被限制在『stat』的權限。

另外,因為這個option是遞迴的下去處理,所以當你底下的檔案系統移大的話,你就要有足夠的動態記憶體可以用,并且會花很多時間,這邊要特別注意一下。

-D DD

讓lsof使用裝置快取檔(device cache file),但是這個option有時候會被限制住。『-D』必須要有一個功能字母(function letter),而這些功能字母後面也可以接一個路徑名稱,相關的字母如下條列:

? 回報裝置快取檔的路徑。
- ------------
b 建制檔案快取檔。
i 忽略檔案快取檔。
r 讀取檔案快取檔。
u 讀取並且更新檔案快取檔。

『b』,『r』和『u』通常會隨著一個路徑名稱,而有時候會被限制,被限制住的話在用『-h』或是『-?』時,在『-D』底下就不會出現這三個功能字母。

一般來說,『b, r, u』後面都會有裝置快取檔的路徑,預設的話是在home資料夾的『.lsof hostname』,但是這個行為也是可以在組態和編譯時期被改變的。

『b』可取得的話,它會讓lsof在預設或是指定的地方建立一個新的裝置快取檔。

『i』的話則是讓lsof忽略預設的裝置快取檔並且從kernel那邊直接獲取相關的裝置資訊。

『r』則是從預設或指定路徑下讀取裝置快取檔,如果沒有既存的檔案或寄存檔案有狀況時,並不會產生一個新的。如果沒有指定路徑的話,這個功能也不會更新或是建立一個新的快取檔。

『u』的話,從預設的路徑或指定的路徑下讀取檔案快取檔,如果可以的話就會重建,如果你有使用『-D』option的話,則這個功能會被自動呼叫。

+|-e s

忽略檔案系統中其發送到kernel的系統呼叫的路徑名稱是屬於block的。『+e』忽略了『stat(2)』,『lstat(2)』,大部份是『readlink(2)』 kernel function calls。『-e』的話忽略了『stat(2)』,『lstat(2)』kernel function calls。多重的檔案系統可能要用分開的『+|-e』來隔開,並且『+e』的那個必須要有『readlink(2)』。目前這個option只有Linux才有,其他的系統是沒有的。

+|-f [cfgGn]

這個option會歸類一些kernel的檔案結構資訊是被允許的(enabled “+”)或是繼承的(inhibited “-”)。 …..balabala…..

-F f

…..balabala…..

-g [s]

選擇或是排除一個清單的PGID(Porcess Group IDentification),這個清單的集合格式事像是『123』或是『123,^456』,要注意的是,在集合之中不能有空格,而有個『^』的則代表排除。

-i [i]

選擇所有檔案清單其網路位址跟所指定的介面『i』符合,如果沒有指定位址的話,則這個option將會列出所有的網路和x.25(HP-UX)網路檔。

如果只有使用『-i4』或是『-i6』,且後面沒有接任何位址的話,代表只列出相關的IPv4或是IPv6使用檔。你當然可以在同一個條件裡面下了『-i4』後又下了『-i6』,但是這個就跟直接下『-i』一樣,所以就沒太大意義了。如果有需要的話可以用多重的『-i』來指定多個位址,但是上限是100個。

一個網路的位址必須遵守底下的這個格式:

[46][protocol][@hostname|hostaddr][:service|port]

解釋如下:

  • [46]:代表IP的版本,IPv4或是IPV6。如果沒有指定的話那就代表兩種版本都可以使用。
  • [protocol]:是協定的名稱,像是『TCP』或是『UDP』。
  • [hostname]:是一個網路上的host name,除非你開檔是使用IP,不然就是使用hostname來開啟檔案。
  • [hostaddr]:是一個IPv4或是IPv6的位址。
  • [service]:一個服務的名稱,這個名稱會在『/etc/services』底下。
  • [port]:是一個,或是一個清單的port number。

IPv6只有在UNIX dialect支援的狀況下才能使用,如果你要確認是否能使用的話,可以下指令:

lsof -h

或是

lsof -?

然後看一下『-i』option,是否包含『46』和IPv『46』,如果有的話就代表有支援。而且當然你有指定要顯示IPv4的話就不會顯示相關的IPv6訊息,反之亦然。如果一個已經開啟的IPv4檔案的位址已經被對映(mapped)到IPv6上的話,則這個檔案的類型將會是IPv6不會是IPv4。

在這整個『-i』資訊中,至少要提供一個位址元件資訊 - 4, 6, protocol, hostname, hostaddr, 或是service。『@』的話,後面接的是指定host資訊,『:』則是接port的資訊,然後是『hostname』或是『hostaddr』,下一個是『service name』或是『port』,如果有指定『service name』的話,最後還要提供『protocol』的資訊。

『service name』和『port』也可以被結合成一個清單,這個清單是被逗號(commas)『,』或減號(minus sign)所隔開。

底下是幾個位址的例子:

[-i6]         - IPv6 only
[TCP:25]      - TCP and port 25
[@1.2.3.4]    - Internet IPv4 host address 1.2.3.4
[@[3ffe:1ebc::1]:1234] - Internet IPv6 host address
                         3ffe:1ebc::1, port 1234
[UDP:who]     - UDP who service port
[[email protected]:513] - TCP, port 513 and host name lsof.itap
[tcp@foo:1-10,smtp,99] - TCP, ports 1 through 10,
     service name smtp, port 99, host name foo
[tcp@bar:1-smtp]    - TCP, ports 1 through smtp, host bar
[:time]     - either TCP, UDP or UDPLITE time service port

-K

選擇一個行程的task/thread清單來顯示,當在Linux上你都有指定『-K』和『-a』的話,並且主要的行程的task也有被其他的option給選擇,則主要的行程也會在沒有任何task id的狀況下被顯示出來。

一般來說,thread和task會繼承呼叫者的檔案,但是有可能會關閉一些然後又開啟其他的,所以lsof會總是回報所有thread和task的開啟檔案。

-k kk

具體指定一個kernel 名稱清單『kk』,用來代替像是『/vmunix』,『/mach』等等。但是這個option不支援在IBM RISC/System 6000上的AIX。

-l

抑制user ID到login name的轉換。通常在login name的查詢有狀況或是很慢時很有用。

+|-L [l]

允許或不允許列舉特定檔案連結數量的檔案,但是前提是他們要是可取得的,像是在sockets和大部分的FIFOs和pipes都是無法取得檔案連結數量的。

當『+L』後面沒有接任何數字的話,則不管檔案的連結數是多少,都會被列出來,而如果是使用『-L』的話,將會沒有連結數會顯示出來,預設的話是不顯示。

當『+L』後面有個數字的話,則所有檔案的連結數少於這個數子的才會被顯示出來。比較特殊的是『+L1』,將會顯示相關的開啟檔案其狀態是被『unlinked』的。另一個比較特殊的案例是『+aL1 < file_system >』,將會在指定的檔案系統上選擇unlinked的開啟檔案。

對於其他的連結數比對,請使用『-F』或是script或是你自己的程式處理。

+|-m mm

具體指定一個替代的kernel記憶體檔案或是『activates mount table supplement processing』。

option『-m』的參數『mm』,主要是用來取代『/dev/kmem』或是『/dev/mem』等等的檔案。

option『+m』會則會將一個『mount supplement』檔給寫到標準輸出檔。所有其他的options將會被省略。

在每個『mount supplement』檔底下,對於每個已經掛載的檔案系統都會有一行包含了已經掛載的檔案系統的資料夾,隨著一個空白字符,然後在來是一個16進位的裝置號碼,像是『/ 0x801』,Lsof可以使用這個『mount supplement 』檔來取得每個檔案系統上的裝置序號,像是你用『stat(2)』或是『lstat(2)』取得一樣。

對於『+m』和『+m mm』並不是在所有的系統上都可以取的,這邊要注意一下。

+|-M

選擇是否要啟用對於本地端 TCP, UDP, UDPLITE 之類的port的『portmapper registrations reporting』數據。預設的報表模式是被lsof在編譯時期的『HASPMAPENABLED』所決定的,預設的話是不會開啟,所以需要的話就必須要用『+M』來啟用。

當『portmapper registrations reporting』啟用的話,lsof將會顯示對於本地端TCP, UDP或是UPLITE port的資訊在中括號裡面,而前面會伴隨著port number或是service names,像是『:1234[name]』或是『:name[100083]』等等。註冊的資訊有可能是名稱或是數字,端看註冊程式。

跑這個模式可能會讓整個lsof變慢,或是整個block住,不確定的話就把這個option取消然後在跑一次,看會不會頓吧。

這個模式主要是用來辨別如果在相關的TCP/UDP/UDPLITE中,其包含kernel結構的本地端部份,或者是外部的部份,並且其外部位址和本地端位址是一樣的狀況下,或是被包含在kernel結構的外部部份,且其外部的位址卻是INADDR_LOOPBACK (127.0.0.1)的狀況。所以你會發現在這些多重網路介面的狀況之下,當你的外部位址和另一個介面的本地端位址會不一樣的狀況下,這些外部port有可能會被忽略。

這個option只有在你的系統有支援RPC head files的狀況下才支援,像是有些Linux發行版搭配的是Glibc 2.14是沒有的。

-n

抑制network numbers到host names的轉換。通常這個option會讓lsof跑得更快,也在host name的查詢有狀況或是很慢時很有用。

-N

是否要顯示NFS檔案。

-o

讓lsof顯示檔案的偏移量。這會讓『SIZE/OFF』的輸出欄位標頭改成『OFFSET』。在某一些UNIX的版本上,lsof沒辦法準確/一致的從kernel那邊獲取到所有檔案的offset資訊,而有時候只是對於特定的檔案像是socket檔。『-o』和『-s』options兩個是不能共用的,所以千萬不能一起用。當兩個都沒有指定的話,則lsof則會看那個類型『size』/『offset』是適用於這個檔案類型的。

-O

讓lsof迴避一些在kernel就該被避掉的blocked操作,舉個例子來說,像是forked一個子行程。

-p s

直接提供一個包含PID的清單給lsof,PID的中間要以逗號區隔開來,這個清單除了可以包含以外,也可以使用排除的邏輯,舉例『''123''』或是『''123'',^456』

-P

抑制port numbers到port names的轉換。通常這個option會讓lsof跑得更快,也在port name的查詢有狀況或是很慢時很有用。

+|-r [t[m]]

讓lsof處於『repeat mode』,一次delay『t』秒,預設的話是15秒。如果使用『-』的話就會一直repeat下去。

每一次的列舉的結尾,如果有特別指定『-F』的話,則預設的『marker』會是『m』,否則將會是『========』,然後最後都會是一個『NL』字元。

『m< fmt>』代表的是這個結尾線的格式,如果前面有一個『m』的話就代表要被函數『strftime』所預處理。

通常這個選項會降低lsof的負擔,也就是說,好好的搭配這個option,輸出的話在用相關的awk,perl或是C去接的話,就會很有效率。

-R

在欄位『PPID』上導出Parent PID。

-s [p:s]

只有『s』的話將會將會讓lsof一直出現檔案的size,會讓欄位『SIZE/OFF』的名稱直接變成只有『SIZE』,而如果這個檔案沒有size的話,則什麼是都不會發生。

這個選項也並不是哪個系統都有的,老樣子,直接用『-h』和『-?』來看看有沒有支援,如果有支援的話,如果有支援的話,則後面可以接一個protocol的名稱『p』,可以是『TCP』也可以是『UDP』,跟之前的幾個option一樣,這邊如果前面加個『^』的話也就代表的是排除的意思。

如果只有TCP還是UDP被指定的話,這時候就還是要指定一下『-i』,舉個例子來說,列舉TCP狀態是『LISTEN』的:

-iTCP -sTCP:LISTEN

或者是,列舉所有狀態不是『Idle』的:

-iUDP -s^UDP:Idle

通常在Unix-like上的State名稱都會不太一樣,所以不太可能會提供一個完整個清單,只能提供一個大概的清單如下:

  • CLOSED,
  • IDLE,
  • BOUND,
  • LISTEN,
  • ESTABLISHED,
  • SYN_SENT,
  • SYN_RCDV,
  • ESTABLISHED,
  • CLOSE_WAIT,
  • FIN_WAIT1,
  • CLOSING,
  • LAST_ACK,
  • FIN_WAIT_2,
  • TIME_WAIT.

UDP的話則只有兩種Unbound 和 Idle.

沒有加參數的『-o』和『-s』這兩個是互斥的,記得不能共用。而有些類型的檔案是沒有真正的size的,像是sockets,FIFOs,pipes等等,所以lsof就會顯示他們所繫結的kernel buffer的總量。

-S [t]

具體指定一個選擇性的time-out seconds給kernel functions,像是『lstat(2)』,『readlink(2)』,『stat(2)』等等這些也許會造成死結(deadlock)的函數,『t』的最小值會是2,預設是15。

-T [t]

這個option控制有些TCP/TPI資訊的輸出,這些資訊也可以由『netstat(1)』裡面取得,在正常的輸出中,資訊會在小括號中間,並且除了TCP和TPI之外的狀態名稱都會伴隨著一個等號『=』,像是底下這樣子的格式:

<TCP or TPI state name>
QR=<read queue length>
QS=<send queue length>
SO=<socket options and values>
SS=<socket states>
TF=<TCP flags and values>
WR=<window read length>
WW=<window write length>

當『-T』後面沒有接任何的字元時代表的就是不啟用TCP/TPI資訊的輸出,而如果是底下的字元的話就有各自的效果介紹如下:

f socket options, states, values 和TCP flags, values的輸出。
q queue length的輸出。
s connection state的輸出。
w window size的輸出。

一樣,這整個option與其子選項並不是所有的系統都適用,所以如果有任何疑問的話就請『-h』或是『-?』一下。

中間出現的所有『Socket options』,『socket states』,『socket values』,『TCP flags』,『TCP value』,通常可以在相關標頭檔的『SO (socket options)』,『so』,『SS (socket states)』,『TCP』和『TF_ (TCP flags and values)』後面,像是『sys/socket.h』,『sys/socketvar.h』和『netinet/tcp_var.h』等等查詢一下,可以找到相關的含意。

如果一個flag或是option有值的話,通常格式會像是『SO=LINGER=5』,『SO=QLIM=5』或是『TF=MSS=512』這樣,總共會有底下這幾種數值出現(我覺的原文比較好懂,所以直接原文貼上):

Name
Reported Description (Common Symbol)
KEEPALIVE keep alive time (SO_KEEPALIVE)
LINGER linger time (SO_LINGER)
MSS maximum segment size (TCP_MAXSEG)
PQLEN partial listen queue connections
QLEN established listen queue connections
QLIM established listen queue limit
RCVBUF receive buffer length (SO_RCVBUF)
SNDBUF send buffer length (SO_SNDBUF)

-t

具體指示lsof要產生更簡潔的輸出,意思就是只有PID而沒有標頭,這樣輸出就可以直接pipe給kill(1)程式了。

-u s

列出特定使用者所開啟的檔案,可以是登入使用者的名稱或是UID,可以是單個也可以是多個,只要中間用逗號隔開就好,像是『'abd'』或是『'548,root'』。跟上面所介紹過的一樣,可以用『^』來排除不想要看的資訊,舉個例子來說,要列出所有非root所開啟的檔案就要用『-u ^root』或是『-u ^0』。

-U

列舉出UNIX的domain socket files。

-v

列出lsof的版本資訊,其中包含了:修改版本,這個版本的lsof的binary何時build的,誰和何時建置這個binary的,這個binary所用的編譯器名稱,這個編譯器的版本,這個lsof binary所建制時的所有compiler/loader flags,和相關的系統資訊。

-V

讓lsof列出你請它找,但是它沒有找到的命令名稱,檔名,網路位址或是網路檔案,登入名稱,NFS檔案,PID,PGIDs和UIDs等等資訊。這個Option會被其他的Option的聯集給影響到或是在編譯時期的Option給影響到,因為編譯時期有個Option可以限制這項資訊的輸出,在這些狀況之下lsof將有可能不會列出這些你想要看的資訊。

舉個例子來說,參考一下底下的指令:

lsof  -V -iTCP@foobar -a -d 999

當你在編譯時期時有定義『HASSECURITY』和『HASNOSOCKSECURITY』的話,則系統就算無法開啟『TCP@foobar』或是無法取得FD-999的話也不會回報錯誤。

+|-w

是否要啟用warning messages的限制。

-x " [fl]”

這個Option可以隨著『+d』或是『+D』來使用,這樣在掃描資料夾(+d)或是資料夾樹(+D)時就可以和連結檔(symbolic links)和掛載點(mount points)交錯處理。官方文件說這個Option似乎一定要跟著『+d』或是『+D』來使用。

如果只有使用『-x』而沒有任何參數的話,則連結檔和掛載點的交錯處理就會被啟用。而『f』的話就代表啟用檔案系統掛載的交錯處理,『l』則當然就是連結檔的交錯處理。

-X

這個Option會隨著系統而行為會不太一樣,主要有分為『AIX』,『Linux』,『Solaris』,這邊的話當然我就只研究一下Linux的部份拉。

當你十分確定你要的資訊跟網路沒關係的話,像是『TCP』,『UDP』,『UDPLITE IPv4』和『IPv6』檔案等等,你就可以使用這個Option來忽略所有相關的網路資訊。所以像剛才說的,如果你要的資訊跟網路無關,那就可以忽略在『/proc/net/tcp』和『/proc/net/udp』等等裡面相關網路的資訊,因為畢竟網路資訊會非常的多,會花很多的時間。

-z [z]

具體列舉出Solaris 10含以上的zone資訊,但是我不確定這個zone跟firewalld裡面的zone有沒有關係,待研究。

如果使用這個Option但是沒有任何參數的話,則所有的Zone資訊都會被列出。又或者這個Option後面可以加一個Zone 的名子『z』,則lsof將只會印出這個zone裡面正在處理的檔案資訊。當然如果你需要列出多重的zone的話就用多個『-z』跟名字的配對就好了。

-Z[Z]

定義SELinux的內文如何被處理。如果這個Option沒有任何參數的話,則將會在欄位『SECURITY-CONTEXT』欄位輸出相關內文。又或者是『-Z』後面會有一個『wildcard security context name』-『Z』,這樣的話則lsof就只會列出在這個內文裡的開啟程式。當然如果你需要列出多重的zone的話就用多個『-Z』跟名字的配對就好了。『Z』的格式的話,舉的例子來說你要搜尋內文是『A:B:C』的話,底下這三個case都可以成立:

A:B:C
*:B:C
*:*:C

--

兩個『-』代表的是keyed options的終結訊號,舉個例子來說,當第一個檔案名稱前面有一個『-』時,或者是你的下一個keyed option是不需要值的,並且下一個option和檔案名稱開始之前還需要用『-』來修飾時。

names

這代表的含意是特別的路徑名稱的檔案或是清單,連結檔會在使用之前就被處理,第一個名字的前頭會先被加一個『--』。

如果某個名稱是個掛載上去的檔案系統或是檔案系統的裝置的話,則lsof將會列出所有在這個檔案系統上的所有開啟檔案,對於檔案系統,要特別注意的是這個名稱必須要匹配於在mount(8)上面輸出的『mounted-on』的清單,也就是要符合這個清單已經掛載的名單就對了,又或者是必須要與掛載資料夾繫結的區塊裝置檔的名稱也行。

如果名稱是一個資料夾的路徑,並且也不是一個已經掛載的檔案系統名稱的話,則lsof就只會將它當成正常的檔案來看待。

如果名稱是多重檔案的家族名稱的話,像是『AIX's /dev/pt[cs]』,則lsof將會列出所有這個裝置所開啟的相關檔案,像是『/dev/pt[cs]/1, /dev/pt[cs]2』等等。

results matching ""

    No results matching ""