Можно ли получить идентификатор группы процессов из / proc?

16

В " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " я вижу, что все ответы упоминаются psи ни одного упоминания /proc.

"ps", кажется, не очень переносим (версии Android и Busybox предполагают разные аргументы), и я хочу иметь возможность перечислять pids с pgids с помощью простых и переносимых инструментов.

В /proc/.../status я вижу Tgid:(идентификатор группы потоков), Gid:(идентификатор группы для безопасности, а не для группировки процессов вместе), но не PGid:...

Каковы другие (не использующие ps) способы получения pgid из pid?

Vi.
источник

Ответы:

24

Вы можете посмотреть на поле 5 в выводе /proc/[pid]/stat.

$ ps -ejH | grep firefox
 3043  2683  2683 ?        00:00:21   firefox

$ < /proc/3043/stat sed -n '$s/.*) [^ ]* [^ ]* \([^ ]*\).*/\1/p'
2683

От man proc:

/proc/[pid]/stat
              Status information about the process.  This is used by ps(1).  It is defined in /usr/src/linux/fs/proc/array.c.

              The fields, in order, with their proper scanf(3) format specifiers, are:

              pid %d      The process ID.

              comm %s     The filename of the executable, in parentheses.  This is visible whether or not the executable is swapped out.

              state %c    One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible wait, D is waiting in
                          uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is paging.

              ppid %d     The PID of the parent.

              pgrp %d     The process group ID of the process.

              session %d  The session ID of the process.

Обратите внимание, что вы не можете использовать:

awk '{print $5}'

Потому что этот файл не является пустым отдельным списком. Второе поле (имя процесса может содержать пробелы или даже символы новой строки). Например, большинство потоков firefoxобычно имеют пробел в своих именах.

Таким образом, вам нужно напечатать 3-е поле после последнего появления )символа там.

cuonglm
источник
Обратите внимание, что awk '{print $5}'не гарантируется правильный ответ, поскольку имя процесса (второе поле) может содержать пробел или символы новой строки.
Стефан Шазелас
Как надежно разобрать /proc/.../stat?
Ви.
3
@Vi, посмотри на этот ответ perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" илиp=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Стефан Шазелас
@ StephaneChazelas: Спасибо, я обновил свой ответ!
cuonglm
Это больше имен процессов, чем имен файлов. Проблема обычно возникает с процессами, которые меняют свое имя (с того, которое они получают из имени последнего файла, который они выполнили).
Стефан Шазелас