PJR-1Y0G devcontainer に残る vscode-server の残骸プロセスを抑止・掃除する
1. 概要
devcontainer は "shutdownAction": "none" でコンテナを生かし続ける運用のため、VS Code の再接続や更新のたびに旧 commit の server-main.js、親を失った extension host・language server・拡張のデーモン(openai.chatgpt の codex など)がコンテナ内に残り、メモリを圧迫していた。grade の background job がメモリ不足で停止した際、VS Code 系だけで約 3 GB(12 GB 中)を占めていた。
原因は次の 2 点。
- PID 1 が devcontainer 既定の
sh -c "while sleep 1 & wait $!"で、孤児プロセスの回収も停止時のシグナル伝播も行わない。 - VS Code 更新後は新しい commit ディレクトリで server が起動し、旧 server は誰にも止められず残る。
2. 完了条件
devcontainer.jsonに"init": trueが設定され、rebuild 後に PID 1 が init になる。- 最新 commit 以外の server とその子孫、および PID 1 の子になった vscode-server 系プロセスだけを停止するスクリプトがあり、
--dry-run/--listで対象を確認できる。稼働中の接続は対象にしない。 - VS Code 接続時(
postAttachCommand)に自動実行され、npm run vscode:ps/npm run vscode:kill-staleで手動実行もできる。 shellcheck/shfmtが通り、CONTRIBUTING に使い方が書かれている。
3. 作業内容
| No | 作業 | 担当 | 状態 | メモ |
|---|---|---|---|---|
| 1 | devcontainer.json に init: true と postAttachCommand を追加する | OPS | done | オーケストレーターが直接対応 |
| 2 | .devcontainer/kill-stale-vscode.sh を作成し、vscode:ps / vscode:kill-stale を追加 | OPS | done | 孤児の疑似プロセスで検出・停止を確認 |
| 3 | CONTRIBUTING に掃除の手順と init 反映に rebuild が必要な旨を記載する | OPS | done | - |
| 4 | コンテナを rebuild して PID 1 が init になることと、接続時の自動掃除を確認する | OPS | done | 2026-09-23 に確認(下記) |
4. 対応結果
.devcontainer/devcontainer.json:"init": true、"postAttachCommand": "bash .devcontainer/kill-stale-vscode.sh"を追加。.devcontainer/kill-stale-vscode.sh: bash とpsだけで動く。最新 commit のserver-main.jsを正とし、(1) 他 commit の server とその子孫、(2) PPID が 1 の vscode-server 系プロセス(生きている server 本体は除外)を SIGTERM → 3 秒後に SIGKILL で停止する。--dry-runで対象表示、--listで全 vscode-server 系プロセスをメモリ順に表示する。package.json:vscode:ps、vscode:kill-staleを追加。CONTRIBUTING.md: 「残った VS Code Server のプロセスを掃除する」を追加。- 検証:
shellcheck/shfmt -i 2通過。/home/node/.vscode-server/fake/orphan-testを名乗る孤児プロセスを起動し、--dry-runで[orphan]として検出、実行で停止することを確認。現行の稼働中プロセスは対象外(no stale processes)。 - rebuild 後の確認(2026-09-23): PID 1 が
/sbin/docker-initになりinit: trueが有効(コンテナ起動は 2026-09-22 20:38)。postAttachCommandはkill-stale-vscode.shとensure-cron.shを実行する。kill-stale-vscode.sh --dry-runはno stale processes (latest server: 7debcd0e)を返し、~/.vscode-server/bin/の commit ディレクトリも 1 つだけで旧 commit の蓄積はない。vscode-server 系は 18 プロセス・合計 2.7 GB で、いずれも稼働中の 1 セッション分(extension host 573 MB、codex デーモン 439 MB、copilot 265 MB など)。全体は 11 GB 中 4 GB 使用で 7 GB 利用可能。 - 残課題:
initは rebuild 後に有効。openai.chatgpt拡張のcodexデーモン(約 390 MB)はユーザー設定remote.extensionKindでホスト側実行にすると更に軽くなるが、個人設定のため本 todo では扱わない。
5. 関連ドキュメント
.devcontainer/devcontainer.json.devcontainer/kill-stale-vscode.shCONTRIBUTING.md