Lsof

嘗試獲取每個程序的打開文件數時與 lsof 命令的差異

  • October 8, 2021

我正在嘗試獲取每個程序的打開文件列表。我從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)。

引用自:https://unix.stackexchange.com/questions/199479