GNU/Linux >> Linux の 問題 >  >> Linux

プロセスごとに開いているファイルをカウントする

これを試してください:

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

/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

ワンライナーとして (| grep -v "0 FDs" を追加してフィルタリング ):

for pid in /proc/[0-9]*; do printf "PID %6d has %4d FDs\n" $(basename $pid) $(ls $pid/fd | wc -l); done

コマンド名を含むワンライナーとして、ファイル記述子数で降順に並べ替えます (| head -10 を追加して結果を制限します) ):

for pid in /proc/[0-9]*; do p=$(basename $pid); printf "%4d FDs for PID %6d; command=%s\n" $(ls $pid/fd | wc -l) $p "$(ps -p $p -o comm=)"; done | sort -nr

この補遺は @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 /proc -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

Linux
  1. 作業プロセスの最大オープン ファイル

  2. sysctl でプロセスごとの最大オープン ファイル数を変更できない

  3. <pid> を持つプロセスの現在の umask

  1. Debian で開いているファイルが多すぎる

  2. プロセスが開いているファイルを確認するにはどうすればよいですか?

  3. Unixで実行中のプロセスの環境変数?

  1. Mysqlエラーの解決:開いているファイルが多すぎます

  2. どのプロセスにPid0がありますか?

  3. 開始したばかりのプロセスのpidを取得する方法