É possível obter o ID do grupo de processos em / proc?

16

Em " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os ", vejo todas as respostas mencionando pse nenhuma mencionando /proc.

"ps" parece não ser muito portátil (as versões do Android e do Busybox esperam argumentos diferentes), e eu quero poder listar pids com pgids com ferramentas simples e portáteis.

Em /proc/.../status, vejo Tgid:(ID do grupo de encadeamentos), Gid:(ID do grupo para segurança, não para agrupar processos), mas não PGid:...

Quais são as outras psmaneiras (sem usar ) de obter pgid do pid?

Vi.
fonte

Respostas:

24

Você pode ver o campo 5 na saída 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.

Observe que você não pode usar:

awk '{print $5}'

Porque esse arquivo não é uma lista separada em branco. O segundo campo (o nome do processo pode conter espaços em branco ou mesmo caracteres de nova linha). Por exemplo, a maioria dos threads firefoxnormalmente tem caracteres de espaço em seus nomes.

Então, você precisa imprimir o terceiro campo após a última ocorrência de um )caractere.

cuonglm
fonte
Observe que awk '{print $5}'não é garantido que você tenha a resposta certa, pois o nome do processo (segundo campo) pode conter caracteres de espaço ou nova linha.
Stéphane Chazelas
Como analisar /proc/.../stat de forma confiável?
Vi.
3
@Vi, veja essa resposta perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" oup=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Stéphane Chazelas
@StephaneChazelas: Obrigado, atualizei minha resposta!
cuonglm
São mais nomes de processos do que nomes de arquivos. O problema normalmente ocorre com processos que alteram seu nome (daquele que eles obtêm do nome do último arquivo que eles executaram).
Stéphane Chazelas