Lsof
嘗試獲取每個程序的打開文件數時與 lsof 命令的差異
我正在嘗試獲取每個程序的打開文件列表。我從PerlMonks執行了以下單行程式碼:
lsof | perl -lane '$x{"$F[0]:$F[1]"}++; END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
它返回打開文件的總數,以及程序名稱和 pid。結果按升序排序,最後一行如下:
1065702 java:15437
因此,當我執行時
lsof -p 15437
,我希望它返回相同的數字,但是我得到:$ lsof -p 15437 | wc -l 403
為什麼會出現差異?
附錄
差異的第三個來源:
$ cd /proc/15437/fd $ ls -1 | wc -l 216
lsof
不帶參數為您提供每個程序的所有執行緒的資訊。雖然
lsof -p "$pid"
只列出程序的打開文件。要獲得相同的號碼,您需要:
lsof -a -K -p "$pid"
另請注意,
lsof
它不僅列出在文件描述符上打開的文件,它還列出了映射文件(如中所示/proc/*/task/*/maps
)、目前工作目錄(如中所示/proc/*/task/*/cwd
)、根目錄 (/proc/*/task/*/root
)。