GNU/Linux >> Linux の 問題 >  >> Linux

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

したがって、このコマンドは親プロセスのすべての子プロセスを終了する必要があることをどこでも読み続けています:

kill -- -$$

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

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

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

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

承認された回答:

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

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

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

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

kill %jobid

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

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

関連:コマンドプロンプトで複数のフォルダからすべての親ディレクトリにファイルを移動しますか?
Linux
  1. UNIX / Linux プロセス:C fork() 関数

  2. すべての子プロセスを見つける方法は?

  3. 親プロセスの作業ディレクトリを設定するにはどうすればよいですか?

  1. 子プロセスが親の SIGINT を受け取る

  2. Linuxで親プロセスが強制終了された後、子プロセスがまだ生きているのはなぜですか?

  3. nohupプロセスを強制終了するプロセスIDを取得するには?

  1. なぜCdはプログラムではないのですか?

  2. Sigintが親プロセスに送信されたときに子プロセスに伝播されないのはなぜですか?

  3. 親プロセスから子プロセスを取得する方法