Est-il possible d'obtenir l'ID de groupe de processus à partir de / proc?

16

Dans " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " je vois toutes les réponses mentionner pset aucune ne mentionner /proc.

"ps" ne semble pas très portable (les versions Android et Busybox attendent des arguments différents), et je veux pouvoir lister les pids avec pgids avec des outils simples et portables.

Dans /proc/.../status je vois Tgid:(ID de groupe de threads), Gid:(identifiant de groupe pour la sécurité, pas pour regrouper les processus), mais pasPGid: ...

Quels sont les autres psmoyens (sans utiliser ) d'obtenir pgid de pid?

Vi.
la source

Réponses:

24

Vous pouvez regarder le champ 5 en sortie 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.

Notez que vous ne pouvez pas utiliser:

awk '{print $5}'

Parce que ce fichier n'est pas une liste séparée vierge. Le deuxième champ (le nom du processus peut contenir des blancs ou même des caractères de nouvelle ligne). Par exemple, la plupart des threads de firefoxont généralement des caractères d'espace dans leur nom.

Vous devez donc imprimer le 3ème champ après la dernière occurrence d'un )caractère.

cuonglm
la source
Notez qu'il awk '{print $5}'n'est pas garanti de vous donner la bonne réponse car le nom du processus (deuxième champ) peut contenir des espaces ou des caractères de nouvelle ligne.
Stéphane Chazelas
Comment analyser de manière fiable /proc/.../stat?
Vi.
3
@Vi, voyez cette réponse 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: Merci, j'ai mis à jour ma réponse!
cuonglm
C'est plus des noms de processus que des noms de fichiers. Le problème se produit généralement avec les processus qui changent leur nom (de celui qu'ils obtiennent du nom du dernier fichier qu'ils ont exécuté).
Stéphane Chazelas