Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-1y0g-devcontainer-stale-vscode-server
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typetodo
specdojo.item_statusdone
specdojo.prioritymedium
specdojo.ownerOPS
specdojo.registered_at2026-09-17T22:14:56Z
specdojo.due_on2026-09-30
specdojo.completed_at2026-09-23T01:41:14Z
specdojo.conclusioninit: true と kill-stale-vscode.sh により残骸プロセスの蓄積を解消。rebuild 後に PID 1 が docker-init になり、接続時の自動掃除も動作することを確認した。

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作業担当状態メモ
1devcontainer.json に init: true と postAttachCommand を追加するOPSdoneオーケストレーターが直接対応
2.devcontainer/kill-stale-vscode.sh を作成し、vscode:ps / vscode:kill-stale を追加OPSdone孤児の疑似プロセスで検出・停止を確認
3CONTRIBUTING に掃除の手順と init 反映に rebuild が必要な旨を記載するOPSdone-
4コンテナを rebuild して PID 1 が init になることと、接続時の自動掃除を確認するOPSdone2026-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.sh
  • CONTRIBUTING.md