Ответ 1
Посмотрите файловую систему /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
EDIT: кредит для @Boban для этого добавления: вы можете передать вывод script выше в следующий script, чтобы увидеть десять процессов (и их имена), в которых открыто большинство файловых дескрипторов:
...
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, возможно, менее читаемыми, поэтому я не ставил его впереди:
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