Как получить pids в одной группе процессов в ОС Linux

У меня есть один вопрос о Linux pid. Как получить pids в одной группе? Кажется, легко получить все pids или pgid с командой "ps" в Linux, но как получить pids, принадлежащие одной группе, или, другими словами, как получить pids одной программы? Кто-нибудь, пожалуйста, помогите мне в этом? Спасибо!

4 ответа

от man ps

To print a process tree:
 ps -ejH
 ps axjf

pstree также может помочь

Обновлено: используйте pidof, чтобы найти pid процессов названных программ. например pidof chrome получит все хромовые pids.


Все остальные ответы, похоже, упоминаются ps, но никто не пытается напрямую получить доступ к /proc.

В "Unix & Linux" есть еще один подход:

awk '{print $5}' < /proc/$pid/stat

или, более безопасно,

perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' /proc/$pid/stat

См. подробности и комментарии в связанном ответе.


Я написал небольшой script для этой цели.

Код

#!/bin/bash 
MY_GROUP_ID=$1
A="$(ps -e -o pgid,pid= | grep [0-9])"
#printf "$A\n"
IFS=$'\n'
for i in $A; do
 GROUP_ID=$(printf "$i" | awk -F ' ' '{print $1}')
 PID=$(printf "$i" | awk -F ' ' '{print $2}')
 if [ "$GROUP_ID" = "$MY_GROUP_ID" ]; then
 printf "$PID\n"
 fi
done
unset IFS

Использование

./test_script.sh (group ID you want to select for)

Объяснение

  • Я предполагаю, что вы знаете некоторые утилит Linux уже. Это написано только для оболочки bash.
  • ps -e -o pgid,pid= просто распечатывает все процессы, причем первое значение каждой строки является его идентификатором группы, а второе значение является идентификатором его процесса, разделенным пробелом.
  • grep удаляет ненужные строки заголовка.
  • IFS - действительно важная внутренняя переменная. Это означает, что строка ограничивается. Конструкция for автоматически ограничивает строку с использованием символа пробела, но если для переменной IFS установлена ​​новая строка, это ограничивает использование этого нового символа пробела. Это гарантирует, что каждая итерационная переменная является строкой из A.
  • Для каждой строки мы используем awk для получения первого значения - это идентификатор группы, а второе значение - это PID.
  • Если идентификатор группы соответствует желаемому, распечатайте соответствующий PID.
  • После того, как вы закончите, вы должны отключить IFS до значения по умолчанию, чтобы оно не задерживалось со своим измененным состоянием.

Примечания

Надеюсь, это поможет. Меня устраивает. Это не очень сложно, как только вы поймете, как работает awk и ps. Остальное - просто синтаксический анализ. Если вы хотите передать PID в виде массива, вместо того чтобы печатать его как новую строку, просто разделите его с помощью чего-то другого и создайте глобальную строковую переменную, содержащую все PID.


На основе man ps есть четыре параметра, которые относятся к группам:

-G grplist
 Select by real group ID (RGID) or name. This selects the processes whose real group name or ID is in the grplist list. The real group ID identifies the group of the user who created the process, see getgid(2).
-g grplist
 Select by session OR by effective group name. Selection by session is specified by many standards, but selection by effective group is the logical behavior that several other operating systems use. This ps will select by session when the list is
 completely numeric (as sessionsare). Group ID numbers will work only when some group names are also specified. See the -s and --group options.
--Group grplist
 Select by real group ID (RGID) or name. Identical to -G.
--group grplist
 Select by effective group ID (EGID) or name. This selects the processes whose effective group name or ID is in grouplist. The effective group ID describes the group whose file access permissions are used by the process (see getegid(2)). The -g
 option is often an alternative to --group.

Итак, вы можете получить идентификатор группы для своей программы, используя getpgrp [pid-of-your-program], затем вызовите ps -G [group-if-of-your-program].

Возможно, это не так, как вы хотите. Группы процессов и процессы, которые образуют дерево, кажутся разными. ppid является родительским pid процесса, вам может понадобиться что-то, что сообщает вам все pids с данным pid как их ppid? Я не думаю, что есть что-либо гарантировать, что это то же самое, что все pids находятся в одной группе процессов, на самом деле, если есть только одна группа процессов для каждого процесса, они не могут быть.

Как было предложено выше, pstree должен помочь вам понять, что происходит. Опция --show-pids также даст вам все полезные данные, которые могут быть полезны.

licensed under cc by-sa 3.0 with attribution.