レーシングプロセスグループID、このグループを殺す方法は?

レーシングプロセスグループID、このグループを殺す方法は?

私はプロセスグループを学んでいますが、これは私にとって新しいものです。 (私は何よりも次の回答に従おうとしました。SIGINTが親プロセスに送信されたときに子プロセスに伝播されないのはなぜですか?)。試してみましたが、プロセスグループのIDが消えてしまったため削除できません。

$ sleep 1000 &
[1] 6468
$ ps ax -O tpgid | grep sleep
 6468  6511 S pts/4    00:00:00 sleep 1000
 6512  6511 S pts/4    00:00:00 grep --color=auto sleep
$ kill -9 -6511
bash: kill: (-6511) - No such process
$ ps ax -O tpgid | grep sleep
 6468  6515 S pts/4    00:00:00 sleep 1000
 6516  6515 S pts/4    00:00:00 grep --color=auto sleep
$ ps ax -O tpgid | grep sleep
 6468  6517 S pts/4    00:00:00 sleep 1000
 6518  6517 S pts/4    00:00:00 grep --color=auto sleep

なぜこれが起こり、どのように捕まえて殺すことができますか?私は何を得て、何を間違えましたか?

GNU bash、バージョン 4.3.42(1)-リリース(x86_64-pc-linux-gnu)

ベストアンサー1

これは、プロセスグループID(PGID)を印刷するのではなく、「Control tty Process Group ID」tpgidを印刷するためです。説明したようにman ps

   tpgid       TPGID     ID of the foreground process group on the tty
                         (terminal) that the process is connected to, or
                         -1 if the process is not connected to a tty.

したがって、表示されるのはフォアグラウンドプロセスのPIDです。あなたの場合はプログラムですps

$ sleep 1000 &
[1] 6745
$ ps ax -O tpgid | grep -E 'sleep|ps a'
 6745  7136 S pts/1    00:00:00 sleep 1000
 7136  7136 R pts/1    00:00:00 ps ax -O tpgid
 7137  7136 S pts/1    00:00:00 grep --color -E sleep|ps a

上記のように、印刷されたtpgid値はプロセスのPIDですps。あなたが探しているものはpgid以下ではありませんtpgid

   pgid        PGID      process group ID or, equivalently, the process ID
                         of the process group leader.  (alias pgrp).


$ ps ax -O pgid | grep -E 'sleep|ps a'
 8414  8414 S pts/1    00:00:00 sleep 1000
 8656  8656 R pts/1    00:00:00 ps ax -O pgid
 8657  8656 S pts/1    00:00:00 grep --color -E sleep|ps a

もちろん、実際にはどのプロセスグループも実行していないため(たとえば、あるスクリプトが別のスクリプトを呼び出すときに発生する)、PGIDはsleepそのPIDと同じです。しかし、必要に応じて、実際には次のように殺すことができます。

$ kill -9 -8414
$ ps ax -O pgid | grep -E 'sleep|ps a'
10065 10065 R pts/1    00:00:00 ps ax -O pgid
10066 10065 S pts/1    00:00:00 grep --color -E sleep|ps a
[1]+  Killed                  sleep 1000

より有益な例は、次のスクリプトを実行することです。

#!/bin/bash

sleep 1000 &
sleep 1000 &
sleep 1000 &

sleep 1000

これを別の名前で保存してfoo.sh実行すると、さまざまなsleepコマンドがすべて同じPGIDを持つようになります。

$ foo.sh &
[1] 13555
$ ps ax -O pgid | grep -P '[s]leep|[f]oo.sh'
13555 13555 S pts/1    00:00:00 /bin/bash /home/terdon/scripts/foo.sh
13556 13555 S pts/1    00:00:00 sleep 1000
13557 13555 S pts/1    00:00:00 sleep 1000
13558 13555 S pts/1    00:00:00 sleep 1000
13559 13555 S pts/1    00:00:00 sleep 1000

したがって、各子プロセスは親プロセスのプロセスグループに属しますfoo.sh。今プロセスグループを終了すると、すべてのプロセスが終了します。

$ kill -9 -13555
$ ps ax -O pgid | grep -P '[s]leep|[f]oo.sh'
[1]+  Killed                  foo.sh

おすすめ記事