我正在研究監視進程資源並在Linux中提供定期報告的應用程序,但是我在提取每個進程的打開文件數時遇到了問題。計算每個進程的打開文件
這需要相當長的一段時間,如果我把所有的文件,並根據他們的PID進行分組並計數它們。
如何在Linux中將每個進程的打開文件計數?
我正在研究監視進程資源並在Linux中提供定期報告的應用程序,但是我在提取每個進程的打開文件數時遇到了問題。計算每個進程的打開文件
這需要相當長的一段時間,如果我把所有的文件,並根據他們的PID進行分組並計數它們。
如何在Linux中將每個進程的打開文件計數?
看一看在/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榜單前十位的過程中,可能的可讀性,所以我不把它放在前面:
試試這個:
ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}
我用這個來找到一個給定的用戶(用戶名),其中不要有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
這不是一條評論嗎? – Billa
是的,它可以是對接受答案的評論 –
需要lsof的:'人lsof' – BMW