omarchy-update-user-notify.path used PathExistsGlob= on the packaged migrations directory. That directive is level-triggered: systemd re-checks it every time the triggered unit deactivates and fires again while the glob still matches. Since applied migrations stay on disk forever (state lives in ~/.local/state/omarchy/migrations), the glob always matches, so the oneshot notifier re-triggered itself in a tight loop (~26-66 starts/sec) — burning about a core and flooding the journal for the whole session. The loop existed since the unit was introduced, but the default start-rate limit killed it after 5 iterations, taking the .path unit down with 'unit-start-limit-hit'. That symptom was reported as #6174 and fixed yesterday by setting StartLimitIntervalSec=0 — which removed the only brake and turned the capped hiccup into an unbounded busy-loop. Fix the actual cause instead: * Drop PathExistsGlob= from the .path unit, keeping the edge-triggered PathModified= watch for updates that land mid-session. * Revert the StartLimitIntervalSec=0 override; with the level trigger gone there is no self-re-fire to trip the limit, and the default limit is a useful backstop again. * Preserve the once-per-login pending check the glob used to provide by giving the service its own WantedBy=graphical-session.target, enabled at first-run alongside the other user units. * Add a migration that daemon-reloads, revives a rate-limit-killed .path, restarts the watcher, and enables the login-time notifier on existing installs. Verified with transient path/service units: the old config runs the service 200 times in 3 seconds; the new config runs it zero times while idle and exactly once when a new migration file lands. Thanks to @HANCORE-Linux for finding and diagnosing the problem. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
40 lines
2.0 KiB
Bash
Executable File
40 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
|
|
service="$ROOT/default/systemd/user/bt-agent.service"
|
|
|
|
grep -Fx 'ExecCondition=/usr/bin/systemctl is-active --quiet bluetooth.service' "$service" >/dev/null
|
|
pass "bt-agent skips when bluetooth.service is inactive"
|
|
|
|
grep -Fx 'Restart=on-failure' "$service" >/dev/null
|
|
pass "bt-agent still restarts after runtime failures"
|
|
|
|
sleep_service="$ROOT/default/systemd/user/omarchy-sleep-lock.service"
|
|
grep -Fx 'ExecStart=/usr/bin/omarchy-system-sleep-monitor' "$sleep_service" >/dev/null
|
|
pass "sleep lock service uses the package-backed monitor path"
|
|
|
|
first_run_units="$ROOT/install/user/first-run/enable-user-units.sh"
|
|
grep -Fx 'systemctl --user daemon-reload' "$first_run_units" >/dev/null
|
|
grep -F 'omarchy-sleep-lock.service' "$first_run_units" >/dev/null
|
|
pass "first-run reloads and enables the sleep lock service"
|
|
|
|
upgrade_to_quattro="$ROOT/bin/omarchy-upgrade-to-quattro"
|
|
grep -F '6870b232a6c0474b59187882e6d25ae771bba735098bcbedef8a2b73b97e2b6a' "$upgrade_to_quattro" >/dev/null
|
|
grep -F 'ExecStart=%h/.local/share/omarchy/bin/omarchy-system-sleep-monitor' "$upgrade_to_quattro" >/dev/null
|
|
grep -F 'ExecStart=/usr/bin/omarchy-system-sleep-monitor' "$upgrade_to_quattro" >/dev/null
|
|
grep -F 'reset-failed omarchy-sleep-lock.service' "$upgrade_to_quattro" >/dev/null
|
|
pass "Omarchy 4 upgrade repairs the legacy sleep lock unit path"
|
|
|
|
notify_path="$ROOT/default/systemd/user/omarchy-update-user-notify.path"
|
|
! grep -q 'PathExistsGlob' "$notify_path"
|
|
grep -Fx 'PathModified=/usr/share/omarchy/migrations' "$notify_path" >/dev/null
|
|
pass "migration watcher is edge-triggered so applied migrations on disk cannot re-trigger it"
|
|
|
|
notify_service="$ROOT/default/systemd/user/omarchy-update-user-notify.service"
|
|
! grep -q 'StartLimit' "$notify_service"
|
|
grep -Fx 'WantedBy=graphical-session.target' "$notify_service" >/dev/null
|
|
pass "migration notifier keeps its start-rate limit and still runs once per login"
|