2014-02-13 20 views
17

我正在研究監視進程資源並在Linux中提供定期報告的應用程序,但是我在提取每個進程的打開文件數時遇到了問題。計算每個進程的打開文件

這需要相當長的一段時間,如果我把所有的文件,並根據他們的PID進行分組並計數它們。

如何在Linux中將每個進程的打開文件計數?

+1

需要lsof的:'人lsof' – BMW

回答

29

看一看在/proc/文件系統:

ls /proc/$pid/fd/ | wc -l 

要爲所有過程做到這一點,使用:

cd /proc 
for pid in [0-9]* 
do 
    echo "PID = $pid with $(ls /proc/$pid/fd/ | wc -l) file descriptors" 
done 

編輯:感謝@Boban這個附錄:可以將上述腳本的輸出輸出到以下腳本中,以查看打開最多文件描述符的十個進程(及其名稱):

... 
done | sort -rn -k5 | head | while read -r _ _ pid _ fdcount _ 
do 
    command=$(ps -o cmd -p "$pid" -hc) 
    printf "pid = %5d with %4d fds: %s\n" "$pid" "$fdcount" "$command" 
done 

這裏的另一種方法,以最開放的FDS榜單前十位的過程中,可能的可讀性,所以我不把它放在前面:

+0

它給了我一個錯誤:「不能訪問/ proc/$ pid/fd /:沒有這樣的文件或directoy」 – Aladdin

+0

你的'$ pid'是什麼?你知道shell變量,不是嗎? – Alfe

+0

嘗試使用'ls/proc/$$/fd/|首先是「wc -l」。 '$$'評估你當前的shell;這當然應該始終存在。 – Alfe

1

試試這個:

ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {} 
0

我用這個來找到一個給定的用戶(用戶名),其中不要有lsof的或root訪問上面的FileHandler耗時的過程:

for pid in `ps -o pid -u username` ; do echo "$(ls /proc/$pid/fd/ 2>/dev/null | wc -l) for PID: $pid" ; done | sort -n | tail 
+0

這不是一條評論嗎? – Billa

+0

是的,它可以是對接受答案的評論 –