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

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

27
задан Alfe 29 September 2015 в 12:47
поделиться

2 ответа

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

  ...
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
52
ответ дан Alfe 29 September 2015 в 12:47
поделиться

Я использовал это, чтобы найти лучшие процессы, использующие обработчик файлов для данного пользователя (имя пользователя), где нет доступа к 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
2
ответ дан JG_ 29 September 2015 в 12:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: