Ist es möglich, eine Prozessgruppen-ID von / proc zu erhalten?


16

In " /programming/13038143/how-to-get-pids-in-one-process-group-in-linux-os " werden alle Antworten erwähnt psund keine erwähnt /proc.

"ps" scheint nicht sehr portabel zu sein (Android- und Busybox-Versionen erwarten unterschiedliche Argumente), und ich möchte in der Lage sein, Pids mit Pgids mit einfachen und portablen Tools aufzulisten.

In /proc/.../status sehe ich Tgid:(Thread-Gruppen-ID), Gid:(Gruppen-ID für Sicherheit, nicht zum Gruppieren von Prozessen), aber nicht PGid:...

Was sind andere (nicht benutzte ps) Wege, um pgid von pid zu bekommen?

Antworten:


24

Sie können sich Feld 5 in der Ausgabe von ansehen /proc/[pid]/stat.

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

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

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

Beachten Sie, dass Sie Folgendes nicht verwenden können:

awk '{print $5}'

Weil diese Datei keine leere Liste ist. Das zweite Feld (der Prozessname kann Leerzeichen oder sogar Zeilenumbrüche enthalten). Beispielsweise haben die meisten Threads von firefoxnormalerweise Leerzeichen im Namen.

Sie müssen also das dritte Feld nach dem letzten Vorkommen eines )Zeichens dort drucken .


Es awk '{print $5}'wird nicht garantiert, dass Sie die richtige Antwort erhalten, da der Prozessname (zweites Feld) möglicherweise Leerzeichen oder Zeilenumbrüche enthält.
Stéphane Chazelas

Wie kann ich /proc/.../stat zuverlässig analysieren?
Vi.

3
@Vi, siehe diese Antwort perl -l -0777 -ne '@f = /\(.*\)|\S+/g; print $f[4]' "/proc/$pid/stat" oderp=$(cat "/proc/$pid/stat") && set ${p##*')'} && echo "$3"
Stéphane Chazelas

@StephaneChazelas: Danke, ich habe meine Antwort aktualisiert!
27.

Es sind mehr Prozessnamen als Dateinamen. Das Problem tritt normalerweise bei Prozessen auf, die ihren Namen ändern (von dem Namen der zuletzt ausgeführten Datei).
Stéphane Chazelas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.