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の功績:上記のスクリプトの出力を次のスクリプトにパイプして、ほとんどのファイル記述子を開いている10個のプロセス(およびその名前)を確認できます。
...
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のトップ10プロセスをリストする別のアプローチを示します。
find -maxdepth 1 -type d -name '[0-9]*' \
-exec bash -c "ls {}/fd/ | wc -l | tr '\n' ' '" \; \
-printf "fds (PID = %P), command: " \
-exec bash -c "tr '\0' ' ' < {}/cmdline" \; \
-exec echo \; | sort -rn | head
これを試して:
ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}
私はこれを使用して、lsofまたはrootアクセスを持っていない特定のユーザー(ユーザー名)のトップファイルハンドラー消費プロセスを見つけました:
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