È possibile ottenere l'ID del gruppo di processi da / proc?


16

In " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " vedo tutte le risposte menzionate pse nessuna menzione /proc.

"ps" sembra non essere molto portatile (le versioni di Android e Busybox prevedono argomenti diversi) e voglio essere in grado di elencare pids con pgid con strumenti semplici e portatili.

In /proc/.../status vedo Tgid:(ID gruppo thread), Gid:(ID gruppo per la sicurezza, non per i processi di raggruppamento insieme), ma non PGid:...

Quali sono altri psmodi (non utilizzando ) per ottenere pgid da pid?

Risposte:


24

Puoi vedere il campo 5 in output di /proc/[pid]/stat.

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

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

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

Si noti che non è possibile utilizzare:

awk '{print $5}'

Perché quel file non è un elenco separato vuoto. Il secondo campo (il nome del processo può contenere spazi vuoti o persino caratteri di nuova riga). Ad esempio, la maggior parte dei thread in firefoxgenere ha caratteri spaziali nel loro nome.

Quindi è necessario stampare il 3 ° campo dopo l'ultima occorrenza di un )personaggio lì dentro.


Nota che awk '{print $5}'non è garantito che ti dia la risposta giusta poiché il nome del processo (secondo campo) può contenere spazi o caratteri di nuova riga.
Stéphane Chazelas,

Come analizzare in modo affidabile /proc/.../stat?
Vi.

3
@Vi, vedi quella risposta 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: Grazie, ho aggiornato la mia risposta!
cuonglm,

Sono più nomi di processo che nomi di file. Il problema si verifica in genere con i processi che cambiano il loro nome (da quello che ottengono dal nome dell'ultimo file che hanno eseguito).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.