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+
Возможно, есть множество менее запутанных способов добиться этого, но я хотел показать прогресс.
Я собрал этот небольшой скрипт на основе ответа @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
Хотел бы я ответить чем-нибудь поумнее, но я нашел единственный способ подсчитать 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
; но я не смог найти какой-либо интерфейс, открывающий доступ к этим счетчикам.