@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/20/001-windows-app-safe-child-process-handling-job-object-exit-propagation-stdio-watchdog/#article>
    schema:about <https://comcomponent.com/knowledge/job-object/>, <https://comcomponent.com/knowledge/stdio-deadlock/>, <https://comcomponent.com/knowledge/watchdog-process/> ;
    schema:mentions <https://comcomponent.com/knowledge/kill-on-job-close/>, <https://comcomponent.com/knowledge/proc-thread-attribute-job-list/>, <https://comcomponent.com/knowledge/process-group/>, <https://comcomponent.com/knowledge/console-ctrl-event/>, <https://comcomponent.com/knowledge/graceful-shutdown/>, <https://comcomponent.com/knowledge/heartbeat-monitoring/>, <https://comcomponent.com/knowledge/restart-budget/>, <https://comcomponent.com/knowledge/unqualified-executable-path-risk/>, <https://comcomponent.com/knowledge/process-tree/>, <https://comcomponent.com/knowledge/entire-process-tree-kill/>, <https://comcomponent.com/knowledge/orphaned-process/>, <https://comcomponent.com/knowledge/parent-crash-recovery/>, <https://comcomponent.com/knowledge/crash-loop/>, <https://comcomponent.com/knowledge/parallel-stdio-drain/>, <https://comcomponent.com/knowledge/absolute-path-launch/>, <https://comcomponent.com/knowledge/breakaway-option/>, <https://comcomponent.com/knowledge/iocp/> .

<https://comcomponent.com/knowledge/job-object/> a skos:Concept ;
    skos:prefLabel "Job Object"@ja ;
    skos:definition "誰の子かではなくどのJobに属するかでプロセス群を束ね、制限やまとめての終了を行えるWindowsの仕組み。"@ja ;
    skos:altLabel "ジョブオブジェクト"@ja ;
    skos:altLabel "CreateJobObjectW" ;
    skos:altLabel "AssignProcessToJobObject" ;
    ks:configuredBy <https://comcomponent.com/knowledge/kill-on-job-close/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/parent-crash-recovery/> ;
    ks:implements <https://comcomponent.com/knowledge/process-tree/> .

<https://comcomponent.com/knowledge/stdio-deadlock/> a skos:Concept ;
    skos:prefLabel "標準入出力のデッドロック"@ja ;
    skos:definition "Windowsのpipeが有限バッファであるため、片方の標準出力しか読まないと書き手が止まり、読み手も待ち続けて共倒れになる状態。"@ja ;
    skos:altLabel "stdout/stderrの詰まり"@ja .

<https://comcomponent.com/knowledge/watchdog-process/> a skos:Concept ;
    skos:prefLabel "監視プロセス(watchdog)"@ja ;
    skos:definition "本体プロセスの起動・終了・生存を外から見張り、exit codeや再起動回数を記録する別プロセス。"@ja ;
    skos:altLabel "watchdog" ;
    skos:altLabel "launcher" ;
    skos:altLabel "親サービス"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/job-object/> ;
    ks:automates <https://comcomponent.com/knowledge/restart-budget/> .

<https://comcomponent.com/knowledge/kill-on-job-close/> a skos:Concept ;
    skos:prefLabel "JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE"@ja ;
    skos:definition "最後のjob handleが閉じられたときに、Jobに関連付けられた全プロセスを終了させるJob Objectの制限フラグ。"@ja ;
    skos:altLabel "KILL_ON_JOB_CLOSE" .

<https://comcomponent.com/knowledge/orphaned-process/> a skos:Concept ;
    skos:prefLabel "親を失った子プロセスの残存"@ja ;
    skos:definition "親プロセスが異常終了したあとも回収されずに残り続ける子・孫プロセス。"@ja ;
    skos:altLabel "取り残された子プロセス"@ja .

<https://comcomponent.com/knowledge/parent-crash-recovery/> a skos:Concept ;
    skos:prefLabel "親クラッシュ時の自動回収"@ja ;
    skos:definition "親プロセスが異常終了した場合でも、その子プロセス木を自動的に片づける仕組み。"@ja .

<https://comcomponent.com/knowledge/entire-process-tree-kill/> a skos:Concept ;
    skos:prefLabel "Process.Kill(entireProcessTree: true)"@ja ;
    skos:definition ".NET Core 3.0以降で使える、指定プロセスとその子孫プロセスをまとめて強制終了する.NETのAPI。"@ja ;
    skos:altLabel ".NETのKill(entireProcessTree: true)"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/parent-crash-recovery/> .

<https://comcomponent.com/knowledge/proc-thread-attribute-job-list/> a skos:Concept ;
    skos:prefLabel "PROC_THREAD_ATTRIBUTE_JOB_LIST"@ja ;
    skos:definition "STARTUPINFOEXと組み合わせ、プロセスの起動時点からJobへ所属させるための属性。Windows 10/Windows Server 2016以降で使える。"@ja ;
    skos:altLabel "STARTUPINFOEX" ;
    ks:requires <https://comcomponent.com/knowledge/job-object/> .

<https://comcomponent.com/knowledge/process-group/> a skos:Concept ;
    skos:prefLabel "プロセスグループ(コンソール)"@ja ;
    skos:definition "console signalをどのプロセス群へ送るかを決める仕組み。親クラッシュ時のcleanupやGUI子プロセスの終了までは担わない。"@ja ;
    skos:altLabel "process group" ;
    skos:altLabel "CREATE_NEW_PROCESS_GROUP" ;
    ks:uses <https://comcomponent.com/knowledge/console-ctrl-event/> .

<https://comcomponent.com/knowledge/console-ctrl-event/> a skos:Concept ;
    skos:prefLabel "コンソール制御イベント"@ja ;
    skos:definition "console childへ協調終了を依頼するために送る、CTRL_BREAK_EVENTなどの制御イベント。"@ja ;
    skos:altLabel "CTRL_BREAK_EVENT" ;
    skos:altLabel "GenerateConsoleCtrlEvent" ;
    ks:requires <https://comcomponent.com/knowledge/process-group/> .

<https://comcomponent.com/knowledge/graceful-shutdown/> a skos:Concept ;
    skos:prefLabel "graceful shutdown"@ja ;
    skos:definition "強制終了ではなく、止める合図を出して進行中の処理をなるべく整えてから終了させる終了方式。"@ja ;
    skos:altLabel "正常終了処理"@ja ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/entire-process-tree-kill/> .

<https://comcomponent.com/knowledge/heartbeat-monitoring/> a skos:Concept ;
    skos:prefLabel "heartbeatによる生存確認"@ja ;
    skos:definition "プロセスが生きているのに進んでいない(ハング)状態を検出するために、子プロセスから定期的に出す信号をアプリ層で確認する仕組み。"@ja ;
    skos:altLabel "heartbeat" ;
    skos:altLabel "health probe" .

<https://comcomponent.com/knowledge/restart-budget/> a skos:Concept ;
    skos:prefLabel "再起動予算(restart budget)"@ja ;
    skos:definition "一定時間内に何回まで再起動してよいかの上限で、backoffや連続失敗時の停止・通知と組み合わせて持つ運用ポリシー。"@ja ;
    skos:altLabel "restart budget" ;
    ks:prevents <https://comcomponent.com/knowledge/crash-loop/> .

<https://comcomponent.com/knowledge/crash-loop/> a skos:Concept ;
    skos:prefLabel "crash loop"@ja ;
    skos:definition "即再起動してもまた即落ちることを繰り返し、ログだけが大量に出る状態。"@ja ;
    skos:altLabel "再起動の繰り返し"@ja .

<https://comcomponent.com/knowledge/parallel-stdio-drain/> a skos:Concept ;
    skos:prefLabel "stdout/stderrの並列drain"@ja ;
    skos:definition "標準出力と標準エラーを片方だけ読み切ってからもう片方を読むのではなく、それぞれ独立したハンドラで並行して読み進める実装。"@ja ;
    skos:altLabel "並列読み取り"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/stdio-deadlock/> .

<https://comcomponent.com/knowledge/iocp/> a skos:Concept ;
    skos:prefLabel "I/O完了ポート(IOCP)"@ja ;
    skos:definition "多数の非同期I/Oの完了通知を1つのFIFOキューに集約しつつ、実行可能なスレッド数をコンカレンシー値以下に保つスケジューリング機構を兼ねる、Windowsカーネルの仕組み。"@ja ;
    skos:altLabel "I/O Completion Port" ;
    skos:altLabel "IOCP" .

<https://comcomponent.com/knowledge/process-tree/> a skos:Concept ;
    skos:prefLabel "プロセス木(process tree)"@ja ;
    skos:definition "親から起動した子、その子が起動した孫までを含めた一族のプロセス群。"@ja ;
    skos:altLabel "process tree" .

<https://comcomponent.com/knowledge/breakaway-option/> a skos:Concept ;
    skos:prefLabel "JOB_OBJECT_LIMIT_BREAKAWAY_OK"@ja ;
    skos:definition "子プロセスがJobから離脱(breakaway)することを許可するJob Objectの制限フラグ。意図なく付けると、cleanupできるつもりだった木から一部が抜ける原因になる。"@ja ;
    skos:altLabel "BREAKAWAY_OK" ;
    skos:altLabel "SILENT_BREAKAWAY_OK" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/job-object/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/kill-on-job-close/> ;
    schema:description "Job ObjectはJOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEを付けることで、最後のjob handleが閉じられたときに全プロセスを終了させるよう構成できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/kill-on-job-close/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/orphaned-process/> ;
    schema:description "KILL_ON_JOB_CLOSEにより、親の異常終了まで含めてcleanupを親の寿命へ寄せられるため、親を失った子プロセスの残存を防げる。ただしjob handleを別プロセスへ複製・継承させて最終所有者が曖昧になっている場合や、BREAKAWAY系のオプションで木の一部が離脱している場合は、この効果は成立しない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/job-object/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/parent-crash-recovery/> ;
    schema:description "親の生死と子プロセス木の寿命を結びつけたいなら、基準点はJob Objectであると本記事は結論づけている"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/entire-process-tree-kill/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/parent-crash-recovery/> ;
    schema:description "Kill(entireProcessTree: true)は明示的に止めるAPIとして便利だが、親クラッシュ時の自動回収やgraceful shutdownまで含む設計の代替にはならない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.kill?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/proc-thread-attribute-job-list/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/job-object/> ;
    schema:description "PROC_THREAD_ATTRIBUTE_JOB_LISTで起動時点からJob所属にするには、あらかじめ作成したJob Objectのハンドルを渡す必要がある"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/process-group/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/console-ctrl-event/> ;
    schema:description "process groupはCTRL_BREAK_EVENTなどのconsole制御イベントをどこへ送るかを決める仕組みである"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/console/generateconsolectrlevent> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/console-ctrl-event/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/process-group/> ;
    schema:description "console signalを受け取れるのはconsoleを共有しているプロセスだけで、特定のgroupへ限定して送るにはCREATE_NEW_PROCESS_GROUPで作成したprocess groupが前提になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/console/generateconsolectrlevent> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/graceful-shutdown/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/entire-process-tree-kill/> ;
    schema:description "協調終了を依頼し、短いtimeoutで待ち、最後にJobごと強制終了する3段階の順番にすると、正常終了は保ちつつハング時も回収できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.closemainwindow?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/graceful-shutdown/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/console-ctrl-event/> ;
    schema:description "console childへの協調終了は、CREATE_NEW_PROCESS_GROUPで起動しCTRL_BREAK_EVENTを送るという手段で行う"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/console/generateconsolectrlevent> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/watchdog-process/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/job-object/> ;
    schema:description "watchdogを監視対象と同じJobに入れると、監視対象を片づける際に再起動役まで一緒に消えるため、Jobの外に置くべきである"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/watchdog-process/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/heartbeat-monitoring/> ;
    schema:description "プロセスが生きているかだけでは判定できないハングまで見たいwatchdogは、heartbeatなどアプリ層の生存確認を組み合わせる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-registerwaitforsingleobject> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/watchdog-process/> ;
    rdf:predicate ks:automates ;
    rdf:object <https://comcomponent.com/knowledge/restart-budget/> ;
    schema:description "watchdogはworker世代ごとにJobを作り直す再起動運用を、restart budgetの範囲内で自動化する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/restart-budget/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/crash-loop/> ;
    schema:description "backoffや一定時間内の再起動回数上限、連続失敗時の停止・通知といったrestart budgetを持つことで、即再起動と即落ちを繰り返すcrash loopを避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/parallel-stdio-drain/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/stdio-deadlock/> ;
    schema:description "stdoutとstderrを独立したハンドラで並行して読み進めれば、片方が満杯になって親子が読み待ち・書き待ちで固まる状態は成立しない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/job-object/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/iocp/> ;
    schema:description "Job ObjectはI/O完了ポートを関連付けてプロセスの起動・終了通知を受け取れるが、その通知だけでcorrectnessを組むべきではなく監視・集計向けと位置付けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/job-object/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/process-tree/> ;
    schema:description "Jobの境界がプロセス木の境界であり、誰の子かではなくどのJobに属するかでプロセス木を束ねる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/breakaway-option/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/orphaned-process/> ;
    schema:description "JOB_OBJECT_LIMIT_BREAKAWAY_OKやSILENT_BREAKAWAY_OKを意図なく付けると、cleanupできるつもりだった木から一部のプロセスが抜けて残り得る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
