Как получить количество inotify Watches в использовании

pidof -x test.sh должен дать вам то, что нужно для получения PID.

Из man-страницы,

-x Scripts too - это заставляет программу также возвращать идентификаторы процессов оболочек, выполняющих названные скрипты.

Вот мой тест,

tony@trinity:~$ ls -l testit.sh
-rwxr-xr-x 1 tony tony 83 Jan  5 14:53 testit.sh
tony@trinity:~$ ./testit.sh
1000
999
998
997

тем временем

tony@trinity:~$ ps -ef | grep testit.sh
tony      4233 20244  0 14:58 pts/5    00:00:00 /bin/bash ./testit.sh
tony      4295  3215  0 14:58 pts/6    00:00:00 grep --color=auto testit.sh

и затем

tony@trinity:~$ pidof -x testit.sh
4233

Ваш последующий запрос - обычная проблема, одним из решений является

ps aux | grep test.sh | grep -v grep

который должен дать вам только одну строку (при условии, что test.sh уникален).

И, наконец, в вашей последней команде вы передаете не просто один PID, а целую строку текста, а это не то, как ps ожидает получить PID в любом случае (он ожидает PID после -p).

Например,

tony@trinity:~$ ps aux | grep testit.sh
tony      4233  0.1  0.0   4288  1276 pts/5    S+   14:58   0:00 /bin/bash ./testit.sh
tony      5728  0.0  0.0   3476   760 pts/6    S+   15:04   0:00 grep --color=auto testit.sh

Поэтому нам нужно вывести grep, а затем вернуть только pid.

tony@trinity:~$ ps aux | grep testit.sh | grep -v grep | awk '{print $2}'
4233

Затем,

tony@trinity:~$ ps -o stat --no-headers -p $(ps aux | grep testit.sh | grep -v grep | awk '{print $2}')
S+

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

5
21.02.2019, 01:22
2 ответа

Я собрал этот небольшой скрипт на основе ответа @mosvy. С момента первоначального замысла в него было внесено немало улучшений (стабильность на старых системах, общее количество, скорость ). На большинстве нормальных машин запуск должен занять менее 100 мс. Несмотря на то, что он был намного быстрее, чем другие альтернативы, когда я сделал его изначально, Саймон Маттер добавил несколько улучшений скорости для сильно загруженного Big Iron Linux (сотен ядер ), которые значительно ускорили его, заняв по сравнению с десятью минутами (! )до 15 секунд.

   INOTIFY
    WATCH
    COUNT     PID USER     COMMAND
--------------------------------------
    3044   3933 myuser node /usr/local/bin/tsserver
    2965   3941 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/bin/tsserverForkStart /hom
     979   3954 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/node_modules/typescript/li
       1   3899 myuser /usr/local/bin/node --no-warnings /home/myuser/dev/dotfiles/common-setup/vim/dotvim/plugged/coc.nvim/build/i

    6989  WATCHES TOTAL COUNT
17
27.01.2020, 20:32

Хотел бы я ответить чем-нибудь поумнее, но я нашел единственный способ подсчитать inotify(7)часы, установленные пользователем,:

find /proc/*/fd -user "$USER" -lname anon_inode:inotify \
   -printf '%hinfo/%f\n' 2>/dev/null |
   xargs cat | grep -c '^inotify'

Измените "$USER"на фактического пользователя, о котором вы хотите получить информацию; "`id -u`"для текущего пользователя. Обратите внимание, что max_user_watches— это ограничение на -пользователя, а не на процесс или на экземпляр inotify/файловый дескриптор.

Сначала будут findоткрыты все файловые дескрипторы, созданные inotify_init*(2), а затем просмотрен соответствующий /proc/PID/fdinfo/FDфайл для получения информации об дескрипторах наблюдения, добавленных с помощью inotify_add_watch(2)к каждому из них (на справочной страницеproc(5)под /proc/[pid]/fdinfo/для описания конкретных записей inotify -). Опция -cдля grepпозволит напечатать количество всех строк, соответствующих шаблону.

Примечание:счетчик для inotify_watchesхранится так же, как и другие счетчики для -пользователей в struct ucounts, на которые ссылается структура пространства имен пользователей --, см.include/linux/user_namespace.h; но я не смог найти какой-либо интерфейс, открывающий доступ к этим счетчикам.

8
27.01.2020, 20:32

Теги

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