Вопрос или проблема
Я запускаю iotop
, чтобы проверить программы, которые сильно используют диск, на случай, если мне нужно уменьшить их приоритет. Обычно этого достаточно, но iotop
показывает только идентификатор потока (TID), и иногда я хочу узнать идентификатор процесса (PID), чтобы узнать больше о том, какой процесс отвечает.
К сожалению, хотя ps
может отображать TID (также известный как SPID, LWP), у него нет флага для получения списка TID, как это делается для списка PID с помощью --pid
. Что я могу сделать, так это перечислить TID, а затем использовать grep
для вывода. Например, если идентификатор потока 792, я могу выполнить
$ ps -eLf | grep ' 792 '
что работает достаточно хорошо, но немного неэлегантно.
Есть ли лучший способ?
Вы всегда можете сделать:
ps -ALo pid= -o tid= | awk '$2 == 792 {print $1}'
На Linux:
$ readlink -f /proc/*/task/792/../..
/proc/300
Или с помощью zsh
:
$ echo /proc/*/task/792(:h:h:t)
300
Ответ или решение
Получение PID из TID: Эффективные методы
В мире управления процессами и потоками в операционных системах Linux часто возникает необходимость обнаружить идентификатор процесса (PID) на основании идентификатора потока (TID). В этой статье мы рассмотрим несколько элегантных и эффективных способов решения этой задачи, используя различные команды и подсистемы Linux.
1. Использование команды ps в комбинации с awk
Один из наиболее известных и простых способов — это команда ps
в сочетании с утилитой awk
. Это решение позволяет получить PID, зная TID, без необходимости фильтрации значений с помощью grep
, что делает ваш подход более структурированным.
Пример команды:
ps -ALo pid= -o tid= | awk '$2 == 792 {print $1}'
Здесь:
ps -ALo pid= -o tid=
: показывает все процессы и их потоки, выводя только необходимые поля — PID и TID.awk '$2 == 792 {print $1}'
: фильтрует результаты и выводит соответствующий PID, если TID равен 792.
2. Открытие /proc для получения PID
Наиболее низкоуровневый метод заключается в том, чтобы исследовать файловую систему /proc
, которая предоставляет информацию о процессах и потоках в системе. Зная TID, мы можем использовать readlink
для получения PID.
Пример команды:
readlink -f /proc/*/task/792/../..
Эта команда:
- Ищет все директории в
/proc/*/task/792
, находя соответствующий каталог процесса и возвращая полный путь к PID.
3. Использование Zsh для извлечения PID
Если вы используете Zsh, вы можете воспользоваться его уникальными возможностями для удобного извлечения PID:
echo /proc/*/task/792(:h:h:t)
Здесь (:h:h:t)
использует встроенные функции Zsh для получения базового имени каталога, что делает процесс получения PID весьма лаконичным и понятным.
Заключение
Как показывает практика, существует несколько способов извлечения PID из TID в системе Linux. Выбор метода зависит от вашего рабочего окружения и предпочтений. Используйте команды ps
, обращение к файловой системе /proc
или специфические возможности Zsh, чтобы получить PID, который вам нужен. Эти методы не только эффективны, но и позволяют вам быстро находить необходимую информацию для анализа и управления процессами в системе.
Эти подходы не только упрощают процесс работы с потоками, но и улучшают вашу оперативную эффективность при управлении системными ресурсами.