web-dev-qa-db-ja.com

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

明らかに、kill(0)を効率的にサポートするために、カーネルはプロセスグループ内のプロセスを追跡する必要があります。しかし、その情報はユーザー空間にはまったく公開されていません。その情報を取得するには、procfsツリー全体を反復処理し、pgidを確認する必要があります。

これはLinux、* BSDなどに当てはまります。私がチェックしたすべての* nixシステムにこの問題があります。なぜ彼らはこのように設計されているのですか?

[〜#〜] edit [〜#〜]:kill(0)の例が意味を持つように質問を変更します。

8
yshui

psの出力をフィルタリングすることにより、特定のグループのすべてのプロセスを一覧表示できます。

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

PGIDで直接フィルタリングするpsオプションはありません。これは、おそらくあまり役​​に立たないためでしょう。

内部でpsが何をするかは重要ではありません。

これは、kill -- -1234とは異なり、アトミックではありません。しかし、プロセスグループ内のプロセスをアトミックにリストする方法があったとしても、それはどのようなメリットがあるでしょうか。リストを処理するときには、リストが不完全であるか、PIDが再利用されているデッドプロセスが含まれている可能性があります。

プロセスグループ内の一連のプロセスで役立つことを行うには、カーネルは、グループのメンバーを一覧表示するインターフェイスだけでなく、アクションを実行するインターフェイスを公開する必要があります。そのような唯一のインターフェースは、プロセスにシグナルを送ることです。

Linuxのコマンドラインから、procps-ngのpgrep--pgroup(または-g) 国旗。

6
mattdm

シグナルをPID 0(ゼロ)に送信すると、シグナルは、送信者と同じプロセスグループのメンバーであるすべてのプロセスに配信されます。現在のプロセスグループ以外のプロセスグループは、kill(-PGID)(またはシェルでは_kill -- -PGID_)で通知できます。ここで、PGIDはプロセスグループIDです。

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

シェルでは、

_$ ps -opid,pgid,command
_

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

これは次のようなものを返す可能性があります

_  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を使用)を把握し、関連するプロセスを反復処理して、各シグナルを送信する必要があります。

カーネルはこれを行いますが、プロセスグループを認識して追跡しているため、プロセスグループにシグナルを送信するためにallプロセスを繰り返し処理する必要はなく、グループのメンバーに対してのみです。

プロセスグループID isがユーザーに公開されているため、そのプロセスグループIDについてoneプロセスをクエリするだけで、その中のすべてのプロセスに信号を送信できます。グループ。

3
Kusalananda