web-dev-qa-db-ja.com

子プロセスのPGIDが親プロセスのPIDではないのはなぜですか?

だから私はこのコマンドが親プロセスのすべての子プロセスを終了させるべきであるところをどこでも読み続けます:

kill -- -$$

Killコマンドで負のIDを使用するとPGIDを参照します。例から、子プロセスのPGIDは親のPIDである必要があるように見えますが、私のシステムではそうではありません。

私のシステムでは、子のPGIDは親スクリプトのPGIDと同じで、bashであることがわかります。

何が起きてる?例は間違っていましたか、それともシステムの設定が異なっていますか?

私が達成する必要があるのは、親を終了せずに子プロセスを終了することです。これにより、親がいるPGIDにkillシグナルを送信したくありません。

13
TCZ8

Process Group IDを表すPGIDを意味していると思います。

プロセスがフォークされると、プロセスはその親からPGIDを継承します。プロセスがプロセスグループリーダーになると、PGIDが変更され、そのPGIDがPIDからコピーされます。それ以降、それが生成する新しい子プロセスとその子孫は、そのPGIDを継承します(それらが独自の新しいプロセスグループを開始しない限り)。

ほとんどの対話型シェルなどのジョブ制御を備えたシェルでは、各ジョブは独自のプロセスグループに配置されます。シェルスクリプトを実行する場合、スクリプトを実行するシェルプロセスがグループリーダーになり、PGIDはそのPIDと等しくなります。

スクリプトの実行に使用されるほとんどのシェルなど、ジョブ制御のないシェルでは、コマンドはシェルのプロセスグループで実行されます。

構文kill -- -Nは、PGID = Nのグループ内のすべてのプロセスを強制終了します。これは、任意のPIDでは使用できません。PGIDであるため、プロセスグループリーダーのPIDのみを使用できます。これは基本的にシェルの方法です

kill %jobid

構文は機能します。内部で%jobidをジョブのPGIDに変換し、そのPGIDに信号を送信します。

別のシェルスクリプトから独自のプロセスグループでスクリプトを実行する簡単な方法はありません。しかし、いくつかの提案については シェルスクリプトのプロセスグループを設定する方法 を参照してください。

11
Barmar