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

Мне нужно перечислить каждый процесс и сколько дескрипторов файлов открыты для этого процесса, чтобы я мог понять, какие процессы содержат слишком много открытых файлов. Нет, мне не нужно количество открытых файлов только для одного процесса, как задавали другие вопросы. Мне нужно знать номер для каждого работающего процесса, желательно отсортированного в порядке убывания.

lsof не похоже, что он может это сделать. Есть ли какая-нибудь другая полезность или что-то, что может это сделать?

  • Отслеживание файлов, которые используются программой
  • В чем разница между lsof и fuser -uvm
  • В ли списках `lsof` есть несинхронизированные / отложенные записи?
  • Альтернативы для команды lsof?
  • lsof не возвращает файлы, открытые одним и тем же пользователем
  • lsof -p PID vs lsof | grep PID
  • lsof: ПРЕДУПРЕЖДЕНИЕ: не может stat () файловая система fuse.gvfsd-fuse
  • Несоответствие команды lsof при попытке получить количество открытых файлов на каждый процесс
  • Альтернативы для команды lsof?
  • Отслеживание файлов, которые используются программой
  • Как определить запущенные процессы с помощью пакета библиотеки?
  • Ограничение читателей на трубе
  • 2 Solutions collect form web for “Как указать количество открытых дескрипторов файлов по процессам для всех процессов в Unix?”

    Я бы сделал что-то вроде:

     sudo lsof -FKc | awk ' function process() { if (pid || tid) { print n, \ tid ? tid " (thread of " pid ": " pname")" : pid, \ name n = tid = 0 } } {value = substr($0, 2)} /^p/ { process() pid = value next } /^K/ { tid = value next } /^c/ { name = value if (!tid) pname = value next } /^f/ {n++} END {process()}' | sort -rn 

    Для количества открытых файлов и замените /^f/ на /^f[0-9]/ для числа дескрипторов открытых файлов .

    Это будет работать как минимум с Solaris и Linux и, вероятно, с большинством других ОС, поддерживающих файловую систему /proc :

     #!/bin/sh cd /proc echo " count pid" ls -d [1-9]*/fd/* 2>/dev/null | sed 's/\/fd.*$//' | uniq -c | sort -rn 

    Используйте -rg вместо -rg в Linux или других операционных системах, используя sort GNU.

    Linux и Unix - лучшая ОС в мире.