web-dev-qa-db-ja.com

/ procからプロセスグループIDを取得することは可能ですか?

" https://stackoverflow.com/questions/13038143/how-to-get-pids-in-one-process-group-in-linux-os "には、psおよび/procについて言及している人はいません。

"ps"はあまり移植性がないようで(AndroidとBusyboxのバージョンは異なる引数を想定しています)、シンプルで移植可能なツールを使用してpidをpgidでリストできるようにしたいと考えています。

/proc/.../statusにはTgid:(スレッドグループID)、Gid:(プロセスのグループ化ではなくセキュリティのためのグループID)が表示されますが、PGid:...は表示されません。

Pidからpgidを取得する他の(psを使用しない)方法は何ですか?

16
Vi.

/proc/[pid]/statの出力でフィールド5thを確認できます。

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

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

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.

次のものは使用できないことに注意してください。

awk '{print $5}'

そのファイルは空白で区切られたリストではないためです。 2番目のフィールド(プロセス名にはブランクまたは改行文字が含まれる場合があります)。たとえば、firefoxのほとんどのスレッドは、通常、名前にスペース文字が含まれています。

したがって、)文字が最後に出現した後の3番目のフィールドを印刷する必要があります。

24
cuonglm