linux - kid3 - command line mp3 tag editor



Подсчет открытых файлов на процесс (2)

Я работаю над приложением, которое отслеживает ресурсы процессов и дает периодический отчет в Linux, но я столкнулся с проблемой извлечения количества открытых файлов на процесс.

Это займет довольно много времени, если я возьму все файлы и сгруппирую их в соответствии с их PID и посчитаю их.

Как я могу считать количество открытых файлов для каждого процесса в Linux?

https://ffff65535.com


Попробуй это:

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

Посмотрите на /proc/ file system:

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, вероятно, менее читабельный, поэтому я не ставлю его впереди:

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