Czy można uzyskać identyfikator grupy procesów z / proc?

16

W „ /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os ” widzę wszystkie odpowiedzi, które wspominają psi nie wspominają /proc.

„ps” wydaje się niezbyt przenośny (wersje Android i Busybox oczekują różnych argumentów) i chcę mieć możliwość listy pidów z pgidami za pomocą prostych i przenośnych narzędzi.

W /proc/.../status widzę Tgid:(identyfikator grupy wątków), Gid:(identyfikator grupy dla bezpieczeństwa, nie dla grupowania procesów razem), ale nie PGid:...

Jakie są inne (nieużywane ps) sposoby uzyskania pgid z pid?

Vi.
źródło

Odpowiedzi:

24

Możesz spojrzeć na pole 5. na wyjściu /proc/[pid]/stat.

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

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

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

Pamiętaj, że nie możesz użyć:

awk '{print $5}'

Ponieważ ten plik nie jest pustą listą rozdzieloną. Drugie pole (nazwa procesu może zawierać spacje, a nawet znaki nowej linii). Na przykład większość wątków firefoxzwykle ma w nazwie znaki spacji.

Musisz więc wydrukować 3. pole po ostatnim wystąpieniu tam )postaci.

Cuonglm
źródło
Należy pamiętać, że awk '{print $5}'nie ma gwarancji udzielenia prawidłowej odpowiedzi, ponieważ nazwa procesu (drugie pole) może zawierać spację lub znaki nowej linii.
Stéphane Chazelas
Jak niezawodnie parsować /proc/.../stat?
Vi.
3
@ Vi, zobacz tę odpowiedź perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" lubp=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Stéphane Chazelas
@StephaneChazelas: Dzięki, zaktualizowałem swoją odpowiedź!
cuonglm
To więcej nazw procesów niż nazw plików. Problem zwykle występuje w procesach, które zmieniają swoją nazwę (od tego, który otrzymują od nazwy ostatniego pliku, który wykonały).
Stéphane Chazelas