É 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?

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.