知識マップ: Windowsアプリで子プロセスを安全に扱うチェックリスト

記事「Windowsアプリで子プロセスを安全に扱うチェックリスト」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Windowsアプリで子プロセスを安全に扱う設計の基準点はJob Objectで、KILL_ON_JOB_CLOSEを付けることで親クラッシュ時にもプロセス木ごと自動回収でき、Process.Kill(entireProcessTree: true)だけでは代替できません。終了は協調終了(graceful shutdown)を依頼してから短いtimeoutで待ち、最後にJobごと強制終了する3段階が事故りにくく、console子への協調終了はprocess groupとconsole制御イベントで行います。stdoutとstderrを並列にdrainしないと、Windowsのpipeが有限バッファのために親子が読み待ち・書き待ちで固まるstdioデッドロックが起きます。watchdogは監視対象と同じJobに入れず外側に置き、heartbeatでハングを検知し、restart budgetでcrash loopを防ぐ設計が安定します。

Windows子プロセス安全管理の知識マップJob Objectによるプロセス木の束ねと親クラッシュ時の自動回収、協調終了から強制終了までの終了手順、stdout/stderrの並列drainによるデッドロック回避、watchdogをJobの外に置きheartbeatとrestart budgetで監視する設計の関係を示す図。で構成できる防止する推奨される対応用いるのは非推奨前提とする利用する前提とするより先に行うべき利用する用いるのは非推奨利用する自動化する防止する防止する利用する実装を担う原因になり得るJob Object標準入出力のデッドロック監視プロセス(watchdog)JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE親を失った子プロセスの残存親クラッシュ時の自動回収Process.Kill(entireProcessTree: true)PROC_THREAD_ATTRIBUTE_JOB_LISTプロセスグループ(コンソール)コンソール制御イベントgraceful shutdownheartbeatによる生存確認再起動予算(restart budget)crash loopstdout/stderrの並列drainI/O完了ポート(IOCP)プロセス木(process tree)JOB_OBJECT_LIMIT_BREAKAWAY_OK

概念間の関係(全17件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

Job Object
誰の子かではなくどのJobに属するかでプロセス群を束ね、制限やまとめての終了を行えるWindowsの仕組み。
標準入出力のデッドロック
Windowsのpipeが有限バッファであるため、片方の標準出力しか読まないと書き手が止まり、読み手も待ち続けて共倒れになる状態。
監視プロセス(watchdog)
本体プロセスの起動・終了・生存を外から見張り、exit codeや再起動回数を記録する別プロセス。
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
最後のjob handleが閉じられたときに、Jobに関連付けられた全プロセスを終了させるJob Objectの制限フラグ。
Process.Kill(entireProcessTree: true)
.NET Core 3.0以降で使える、指定プロセスとその子孫プロセスをまとめて強制終了する.NETのAPI。
PROC_THREAD_ATTRIBUTE_JOB_LIST
STARTUPINFOEXと組み合わせ、プロセスの起動時点からJobへ所属させるための属性。Windows 10/Windows Server 2016以降で使える。
プロセスグループ(コンソール)
console signalをどのプロセス群へ送るかを決める仕組み。親クラッシュ時のcleanupやGUI子プロセスの終了までは担わない。
コンソール制御イベント
console childへ協調終了を依頼するために送る、CTRL_BREAK_EVENTなどの制御イベント。
graceful shutdown
強制終了ではなく、止める合図を出して進行中の処理をなるべく整えてから終了させる終了方式。
再起動予算(restart budget)
一定時間内に何回まで再起動してよいかの上限で、backoffや連続失敗時の停止・通知と組み合わせて持つ運用ポリシー。
stdout/stderrの並列drain
標準出力と標準エラーを片方だけ読み切ってからもう片方を読むのではなく、それぞれ独立したハンドラで並行して読み進める実装。
JOB_OBJECT_LIMIT_BREAKAWAY_OK
子プロセスがJobから離脱(breakaway)することを許可するJob Objectの制限フラグ。意図なく付けると、cleanupできるつもりだった木から一部が抜ける原因になる。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。