親プロセスが終了するとそのプロセスから呼ばれた子プロセスも停止する?

OKWave

2008-01-25 10:00

Unixの親プロセスと子プロセスの関係について

はじめまして。

親プロセスが終了するとそのプロセスから呼ばれた
子プロセスも停止するという認識は正しいでしょうか?

というのも、あるシェルスクリプトを"kill -9"コマンドで強制終了させたのですが、そのシェルスクリプト内のコマンド(sleepコマンドです)は終了せずに残っていたので(psで確認しました)、??という感じでした。
さらにそのsleepコマンドの親プロセスが1(init?)になっていました。

色々とWEB上で調べてみたのですが、この動作について
の記述を見つけることができませんでした。

どなたかご存知でしたら是非ご教授下さい。よろしくお願いします。

良回答

親プロセスが先に死ぬと子プロセスはinitプロセスの養子になるというのはunixの仕様です。

プロセスグループという概念があります。子プロセスは親プロセスのプロセスグループ番号を引き継ぎます。プロセスグループ番号はシステムコールで変更できます。変更した場合、自プロセスがプロセスグループリーダーとなって、親プロセスとは別グループになります。プロセスグループ番号は、通常はプロセスリーダーのプロセス番号です。

シェルからコマンドを起動した場合、通常は1パイプが1プロセスグループになります。
aa | bb ; cc
だと、aa と bb は同一プロセスグループ。ccは別プロセスグループ。

で、このプロセスグループ全体にシグナルを送ることが出来ます。システムコールだと、killpg(2)。コマンドだと、プロセスグループ100番にシグナルを送るとすると、kill --100 または kill -15 --100 で出来るのではないかと思います。

(やや自信なしですが、シェルでのパイプ実行中のctrl-CはプロセスグループへのSIGTERMだと思います)

プロセスグループ番号はpsコマンドで参照できます。psのオプションを調べてみてください。

別の方法として、ps の結果を解析してPPIDを調べ、プロセスの親子関係を調べ上げれば、自分が祖先になっている全プロセスをリストアップすることが出来るでしょう。それらに個別にシグナルを送る。

回答

がると申します。
んっと、親プロセスが死んだときに「子プロセスが停止する」とは限りません。というか、親プロセスのもう一つ親(なので、大抵は1のinitプロセス)に結び付けられるような状態になります(っていう挙動がMUSTだったかどうかははっきりしませんが、少なくともそういう実装系は存在します)。

ですので、通常のデーモンであれば、自分がkillされたタイミングで自分からforkした全子プロセスに対してkillシグナルを出すように設計されているもんだと思います。

ZDNET Japan 記事を毎朝メールでまとめ読み(登録無料)

ホワイトペーパー

新着

ランキング

  1. ビジネスアプリケーション

    改めて知っておきたい、生成AI活用が期待される業務と3つのリスク

  2. ビジネスアプリケーション

    ITR調査結果から導くDX浸透・定着化-“9割の国内企業がDX推進中も成果が出ているのはごく一部”

  3. クラウドコンピューティング

    生成 AI リスクにも対応、調査から考察する Web ブラウザを主体としたゼロトラストセキュリティ

  4. ビジネスアプリケーション

    Google が推奨する生成 AI のスタートアップガイド、 AI を活用して市場投入への時間を短縮

  5. セキュリティ

    初心者にも優しく解説!ゼロトラストネットワークアクセスのメリットと効果的な導入法

ZDNET Japan クイックポール

所属する組織のデータ活用状況はどの段階にありますか?

NEWSLETTERS

エンタープライズコンピューティングの最前線を配信

ZDNET Japanは、CIOとITマネージャーを対象に、ビジネス課題の解決とITを活用した新たな価値創造を支援します。
ITビジネス全般については、CNET Japanをご覧ください。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]