
そこで、このコマンドは親プロセスのすべての子プロセスを終了するはずだと、あちこちで読みました。
kill -- -$$
kill コマンドで負の ID を使用すると PGID が参照され、私が見た例では、子プロセスの PGID は親プロセスの PID になるはずですが、私のシステムではそうではありません。
私のシステムでは、子の PGID は親スクリプトの PGID と同じで、bash であることが判明しました。
何が起こっているのでしょうか? 例が間違っているのでしょうか、それとも私のシステムの設定が異なっているのでしょうか?
私が達成する必要があるのは、親プロセスを終了せずに子プロセスを終了することです。そのため、親が存在する PGID に kill シグナルを送信したくありません。
答え1
プロセスがフォークされると、親からPGIDを継承します。プロセスがフォークされるとPGIDは変わります。プロセスグループリーダーの場合、その PGID は PID からコピーされます。それ以降、そのプロセスが生成する新しい子プロセスとその子孫は、その PGID を継承します (独自の新しいプロセス グループを開始しない限り)。
ほとんどの対話型シェルなどのジョブ制御機能を持つシェルでは、各ジョブは独自のプロセス グループに配置されます。シェル スクリプトを実行すると、スクリプトを実行しているシェル プロセスがグループ リーダーになり、PGID はその PID と同じになります。
スクリプトを実行するために使用されるほとんどのシェルのように、ジョブ制御のないシェルでは、コマンドはシェルのプロセス グループで実行されます。
この構文は、kill -- -N
PGID = Nのグループ内のすべてのプロセスを強制終了します。任意のPIDでは使用できません。プロセスグループリーダーのPIDのみがPGIDであるためです。これは基本的にシェルの
kill %jobid
構文は機能します。内部的に%jobid
ジョブの PGID に変換され、その PGID に信号が送信されます。
別のシェルスクリプトから独自のプロセスグループ内のスクリプトを実行する簡単な方法はありません。シェルスクリプトのプロセスグループを設定する方法ただし、いくつかの提案があります。