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

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

だから私は、このコマンドが親プロセスのすべての子プロセスを終了する必要があることをどこでも読んでいます。

kill -- -$$

killコマンドで負のIDを使用するとPGIDが参照されますが、この例では子プロセスのPGIDは親プロセスのPIDである必要がありますが、私のシステムではそうではありません。

私のシステムでは、サブスクリプトのPGIDはbashである親スクリプトのPGIDと同じです。

ここで何が起こっているのでしょうか?この例が間違っているか、システム設定が異なりますか?

私が達成する必要があるのは、親プロセスを終了せずに子プロセスを終了することであるため、親プロセスがあるPGIDに終了信号を送信したくありません。

答え1

プロセスが分岐すると、親プロセスからPGIDを継承します。プロセスがプロセスになると、PGIDが変更されます。プロセスチーム長を選択し、PIDからPGIDをコピーします。その時点から新しい子プロセスが作成され、その子プロセスはそのPGIDを継承します(それ自体が新しいプロセスグループを起動しない限り)。

ほとんどの対話型シェルのように、ジョブ制御機能を持つシェルでは、各ジョブは独自のプロセスグループに配置されます。シェルスクリプトを実行すると、スクリプトを実行するシェルプロセスがグループリーダーになり、PGIDはそのPIDと同じです。

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

この構文は、kill -- -NPGID = Nのグループのすべてのプロセスを終了します。 PIDでは使用できません。プロセスグループリーダーのPIDのみを使用できます。 PGIDだからです。これは基本的にシェル方式です。

kill %jobid

%jobid構文は機能します。内部的にはジョブのPGIDに変換され、信号は対応するPGIDに送信されます。

他のシェルスクリプトの独自のプロセスグループでスクリプトを実行する簡単な方法はありません。バラよりシェルスクリプトのプロセスグループを設定する方法それでもアドバイスが必要です。

関連情報