私はプロセスグループを学んでいますが、これは私にとって新しいものです。 (私は何よりも次の回答に従おうとしました。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