特定のプロセスグループ内のすべてのプロセスを一覧表示する簡単な方法がないのはなぜですか?

特定のプロセスグループ内のすべてのプロセスを一覧表示する簡単な方法がないのはなぜですか?

明らかにkill(0)を効果的にサポートするには、カーネルはプロセスグループのプロセスを追跡する必要があります。ただし、その情報はどのような方法でもユーザー空間に公開されません。この情報を取得するには、procfsツリー全体を繰り返してpgidを確認する必要があります。

これはLinux、* BSDなどに当てはまります。私が確認したすべての* nixシステムにはこの問題がありました。なぜこのように設計されたのですか?

編集する:kill(0) 例が理解できるように質問を変更します。

答え1

出力をフィルタリングして、特定のグループ内のすべてのプロセスを一覧表示できますps

ps -e -o pgid,pid | awk -v p=1234 '$1 == p {print $2}'

PGIDで直接フィルタリングするオプションはありませんps。おそらく役に立たないからです。

フードの下に何があるかはps問題ではありません。

kill -- -1234しかし、プロセスグループのプロセスを自動的にリストする方法がありますが、利点は何ですか?リストを処理すると、リストが不完全または終了し、PIDが再利用されたプロセスが含まれている可能性があります。

プロセスグループのプロセスセットに役立つタスクを実行するには、カーネルはグループメンバーを一覧表示するインターフェイスだけでなく、タスクを実行するインターフェイスも公開する必要があります。唯一のインターフェイスは、プロセスに信号を送信することです。

答え2

Linuxのコマンドラインで(または)フラグpgrepと一緒にprocps-ngを使用できます。--pgroup-g

答え3

PID 0(ゼロ)にシグナルを送信すると、送信者と同じプロセスグループに属するすべてのプロセスにシグナルが転送されます。現在のプロセスグループではないプロセスグループは、プロセスグループIDがどこにあるかを介してkill(-PGID)(またはkill -- -PGIDシェルから)シグナルを送信できます。PGID

PIDのプロセスグループは関数によって返されgetpgid()、現在のプロセスのプロセスグループを見つけることができますgetpgrp()

シェルでは以下を使用できます。

$ ps -opid,pgid,command

現在のセッションのPID、プロセスグループID(PGID)、およびコマンドラインを取得します。

これは次の結果を返すことができます。

  PID  PGID COMMAND
20716 20716 -ksh93 (ksh93)
83662 83662 -ksh93 (ksh93)
 4322  4322 /usr/X11R6/bin/xclock
 5374  5374 tmux: client (/tmp/tmux-11000/default) (tmux)
78747 78747 -ksh93 (ksh93)
29298 29298 ps -opid
63563 63563 -ksh93 (ksh93)
63327 63327 mutt
21790 21790 -ksh93 (ksh93)
64493 64493 /bin/sh /usr/X11R6/bin/startx
14485 64493 xinit /home/kk/.xinitrc -- /usr/X11R6/bin/X :0 -auth /home/kk/.serverauth.E3cwuT5FZR
93531 93531 sh /home/kk/.xinitrc
48598 93531 flwm
28154 93531 xterm
73053 93531 xterm

質問を明確にした後:

これ目的プロセスグループの目的は、すべてのメンバーにシグナルを送信できることです。いいえ各メンバーのプロセスIDを確認してください。

プロセスグループの概念がない場合は、システム内のすべてのプロセスを取得して(親プロセスIDを使用して)プロセス間の関係を見つけ、関連プロセスを繰り返して各プロセスにシグナルを送信する必要があります。

カーネルはこれを行いますが、プロセスグループを知って追跡するので、繰り返す必要はありません。みんなプロセスは、そのグループのメンバーを介してのみプロセスグループにシグナルを送信します。

プロセスグループIDのためはいユーザーに公開、クエリのみ可能一つプロセスは、そのグループ内のすべてのプロセスにシグナルを送信する前に、プロセスグループIDを見つける必要があります。

関連情報