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


13

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

kill -- -$$

killコマンドでネガティブIDを使用するとPGIDが参照され、私が見た例では、子プロセスのPGIDは親のPIDであるはずですが、システムではそうではありません。

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

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

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

回答:


11

プロセスグループIDの略であるPGIDを意味すると思います。

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

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

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

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

kill %jobid

構文は機能します- %jobidジョブのPGIDに内部的に変換し、そのPGIDにシグナルを送信します。

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


ジョブ制御の有無にかかわらずシェルが同じことをすると言っていますか?
TCZ8 14年

1
いいえ。ジョブ制御を備えたシェルは、ジョブごとに新しいプロセスグループを開始します。ジョブ制御のないシェルは、各ジョブの新しいプロセスグループを開始せず、独自のプロセスグループで実行します。
バーマー14年

すごい..初めてそれを読んでいなかった。だから私がしたいのは、ジョブ制御を有効にすることですか?これにより、子のPGIDが親スクリプトのPIDと一致するようになりますか?または、各子供は独自の固有のPGIDを取得しますか?
TCZ8 14年

ジョブ制御に関するドキュメントをオンラインでいくつか見つけましたが、それはうまくいきません。Barmarにご協力いただきありがとうございます。
TCZ8 14年

1
ジョブ制御により、各子は独自のPGIDを取得します。ジョブ制御なしでは、親のPGIDを継承します。しかし、親がプロセスグループリーダーでない場合親はその親からPGIDを継承している可能性があります。
バーマー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.