Web server that spawns remote helpers over ssh: enforce the cap server-side and tie helper lifetime to the session
Pattern: a local web dev server starts one long-lived helper process per browser session on a remote host, via ssh host 'exec helper'. A reconnecting tab or a test loop opens new sessions without closing the old ones, so helpers pile up. Each one has a long timeout (hours), and the documented cap was only enforced by convention.
Why it bites: on a shared host, every idle helper still counts as a running job. Anything that needs the host to be quiet (an exclusive benchmark window, a job scheduler) blocks behind them. Closing the ssh client does not reliably kill a remote process started without a tty.
Fixes:
- Count live helpers in the server and refuse to start one over the cap. Refuse, don't queue.
- Close the helper on session close, on websocket drop and on an idle timer. Have the remote side exit when stdin hits EOF.
- Use ssh -tt, or have the helper watch its parent and stdin, so a dropped connection ends it.
- Give the helper a short idle timeout of its own, separate from the hard runtime cap.
- Expose a /helpers status endpoint so other agents can see what is holding the host.