¿Es posible obtener el ID de grupo de proceso de / proc?

16

En " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " veo todas las respuestas mencionando psy ninguna mencionando /proc.

"ps" parece no ser muy portátil (las versiones de Android y Busybox esperan argumentos diferentes), y quiero poder enumerar pids con pgids con herramientas simples y portátiles.

En /proc/.../status veo Tgid:(ID de grupo de subprocesos), Gid:(ID de grupo por seguridad, no para agrupar procesos juntos), pero noPGid: ...

¿Cuáles son otras psformas (no usar ) de obtener pgid de pid?

Vi.
fuente

Respuestas:

24

Puede mirar el campo 5 en la salida de /proc/[pid]/stat.

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

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

De 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.

Tenga en cuenta que no puede usar:

awk '{print $5}'

Porque ese archivo no es una lista separada en blanco. El segundo campo (el nombre del proceso puede contener espacios en blanco o incluso caracteres de nueva línea). Por ejemplo, la mayoría de los hilos firefoxsuelen tener caracteres de espacio en su nombre.

Por lo tanto, debe imprimir el tercer campo después de la última aparición de un )carácter allí.

Cuonglm
fuente
Tenga en cuenta que awk '{print $5}'no se garantiza que le dé la respuesta correcta, ya que el nombre del proceso (segundo campo) puede contener espacios o caracteres de nueva línea.
Stéphane Chazelas
¿Cómo analizar /proc/.../stat de manera confiable?
Vi.
3
@ Vi, mira esa respuesta perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" op=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Stéphane Chazelas
@StephaneChazelas: ¡Gracias, he actualizado mi respuesta!
Cuonglm
Son más nombres de procesos que nombres de archivos. El problema generalmente ocurrirá con procesos que cambian su nombre (del que obtienen del nombre del último archivo que ejecutaron).
Stéphane Chazelas