![Linuxでカスケードを終了するには? [コピー]](https://linux33.com/image/59124/Linux%E3%81%A7%E3%82%AB%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%89%E3%82%92%E7%B5%82%E4%BA%86%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
プロセスBを生成するプロセスAがあり、プロセスCを生成すると仮定する。どのような状況でAを殺すと、チェーン全体(または私の考えでツリー)が死んで、いつ死ぬのですか?私は時々これが本当であることを知りました。時々Bはppid 1で終わり、Cは影響を受けません。
この動作は特定のLinuxカーネルバージョンによって異なりますか?
答え1
システムkill()
コールとkill
シェルコマンドを使用して、プロセスまたはプロセスグループを終了できます。どちらにしても「カスケード」はありません。
kill()
システムコールまたはシェルコマンドkill
で正の整数が指定された場合、これはプロセスを表します。信号は他のプロセスではなくこのプロセスに送信されます。kill()
システムコールに負の整数が与えられるか、またはシェルコマンドで始まるジョブ識別子(たとえば、または)が与えられると、信号kill
はaのすべてのメンバーに同時に送信されます。%
%1
%2
プロセスグループ。プロセスグループはジョブ制御機能です。対話型シェルの使用では、各シェルパイプ(たとえば、.sed s/foo/bar/ | cat -n | gzip
)はすべて同じプロセスグループの一部である1つ以上のプロセスで構成されています。
(システムコールにはいくつかの追加ケースがあります:-1
すべてのプロセスに送信、0
自分に送信)。
これは、あるプロセスが終了したときに別のプロセスが他の理由で終了しないという意味ではありません。たとえば、
- 子を生成したプロセスは、終了信号を傍受して自分を整理する方法で、終了する前に生成した子プロセスに渡すことができます。
- シェルパイプライン(上記のような)の前のプロセスが何らかの理由で終了すると、通常はシェルパイプラインの以降のプロセスも入力を受け取らないため、すぐに終了します。
カーネルはこれらの「追加」結果について全く責任を負わず、関連ソフトウェアの仕組みによって異なります。