emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920
Conversation
… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle
2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):
- Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
- emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
- _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
- Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
- Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.
2/3.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):
- emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
- _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
- _daemon_scan_pids() = daemon-only cmdline identity (
-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI-m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe. - Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
- Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.
Problem (rant 2026-08-21T16:45:06)
emrgd.pidno longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21;connect.py is_server_running_syncis already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read indaemon.py/_stop_all.py).Changes
emrg/server/daemon.py— deleted the startupemrgd.pidwrite (was "diagnostics only") and the shutdown self-delete step;_shutdown_all()dropped itspid_fileparameter.emrg/_stop_all.py:_read_pid_file()stop_daemon(): wsshutdown→ wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches-m emrg.server) → token cleanup once the port is confirmed closed_port_is_open()(mirrorsconnect.py is_server_running_sync, pure stdlib for the standalone installer) and_daemon_scan_pids()(POSIX ps-scan filtered by new_EMRG_SERVER_RE; Windows reuses the CIM scan withserver_only=True)_scan_windows_python_emrg()gained aserver_onlyparam (filter-m emrg\.servervs-m emrg)verify()daemon residual is now the port probe (previously_read_pid_file+_pid_alive)emrg/gui/daemon_client.js— comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).emrgd.pidreaders/writers inscheduler.py/__main__.py/connect.py.Tests
tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written);_shutdown_all()calls updated to the no-arg signaturetests/test_stop_all.py:TestPidFile→TestPortIsOpen(3) +TestDaemonScanPids(4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch_port_is_openinstead of_read_pid_filetests/test_installer_stop.py: wiring assertions now check_port_is_open/_daemon_scan_pids/_EMRG_SERVER_REVerification
emrg stopnow handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); noemrgd.pidreads/writes remain anywhere inemrg/.