2.5 KiB
2.5 KiB
| created | path | project | tags | type | |||
|---|---|---|---|---|---|---|---|
| 2026-05-18 | Sources/Homelab | herbys-dev-setup |
|
session-notes |
Outcome
Identified that Claude Desktop on us-test-authy accumulates Dispatch subprocess zombies that consume substantial RAM (~10.6GB across 41 processes observed during this session). Closed Desktop to recover ~7GB immediately. Parked the long-term fix as a follow-on — daily nightly stop via user systemd timer is the leading approach.
Topics Covered
- Diagnosed RAM pressure on
us-test-authy(13/23GB used, hunting for the cause) - Found 41
claudesubprocesses totaling 10.6GB, all parented to the live Claude Desktop electron process (PID 183216) — not orphaned, just never reaped - Subprocesses ranged from ~6h to 8 days old; oldest were Dispatch sessions long abandoned
- Confirmed the pattern: Desktop spawns
claude --output-format stream-jsonsubprocesses per Dispatch session, doesn't SIGTERM them on session end, they sit idle attached to the parent - Closing Claude Desktop killed the parent and all children together — clean recovery
- Discussed reaper-cron vs. parent-restart approaches; parent-restart wins on simplicity
Key Learnings
- The subprocess leak is structural, not a cron-able janitor problem. The parent is alive and "owns" the children; they don't get cleaned up until the parent dies.
- This is the same failure mode the dispatch-replacement work is designed to eliminate (harness owns subprocess lifecycle explicitly). Tonight produced concrete evidence for why that work matters.
- User systemd timer is the right mechanism, not root cron — Claude Desktop is a GUI Electron app tied to the user session and DBus.
- "Just stop, don't restart" is cleaner — at 4am there's no graphical session to relaunch into, just stop and let user relaunch on next sign-in.
Follow-ons
- Decide whether to implement the user systemd timer (stop-only at 04:00) or rely on manual daily quit-and-relaunch
- If implementing the timer: confirm hour doesn't conflict with any Lovebug overnight work, then write
~/.config/systemd/user/claude-desktop-nightly-stop.{service,timer} - Verify Manjaro tower exhibits the same leak pattern; if so, deploy same fix via Ansible
- File observation as input to dispatch-replacement design — subprocess lifecycle ownership is a hard requirement, validated by this incident
- Optional safety-net: memory-pressure alert cron (notify if
free -havailable drops below 4GB)