mirror of
https://github.com/ZoneMinder/zoneminder.git
synced 2026-09-16 07:08:09 -04:00
zmpkg.pl hands start/stop/restart to systemd via zmsystemctl.pl, so that pid 1 forks the daemons and they get zoneminder.service's cgroup and mount namespace rather than the web server's. The detection defeated itself: systemdRunning() read pid 1's name out of /proc, which a web server running with ProtectProc=invisible hides from the web user. Starting from the web ui therefore concluded systemd was absent, skipped the delegation and ran zmdc inside the web server's namespace, where ProcSubset=pid hides /proc/stat and every figure zmstats records is wrong. Use -d /run/systemd/system, which is what sd_booted(3) does and stays readable however /proc is mounted. calledBysystem() had to change with it or the two would combine into a start loop, systemd running zmpkg which asks systemd to run zmpkg. It read the parent's name from /proc, equally hidden, and the parent is pid 1 only until it re-parents us. Ask our own cgroup whether we are already the service zmsystemctl.pl would start. Not INVOCATION_ID: systemd sets it for every descendant of a unit, so anything forked from the web ui inherits the web server's copy and would wrongly look systemd-started. Also check the exit status of the zmsystemctl.pl call. It was discarded, so a refused pkexec left the command cleared and nothing started, with nothing logged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019URmtYqza6Rzi6F7cmabSm