Docs › systemd timers with RunVouch
systemd timers with RunVouch
A timer that fires a failing service shows up in systemctl --failed and nowhere else. A timer that never fires (unit disabled, machine asleep, Persistent missing) shows up nowhere at all.
How it runs on systemd timers
The timer starts a .service; wrap that service's ExecStart. Works for system units and systemctl --user units.
Store the key
Put RUNVOUCH_KEY=rv_... in a file with mode 600 and reference it with EnvironmentFile=; do not put the key in the unit file itself, which is world-readable.
Wrap the job
# ~/.config/systemd/user/nightly-report.service [Service] Type=oneshot EnvironmentFile=%h/.config/runvouch.env ExecStart=%h/.local/bin/rv run nightly-report --evidence-file %h/out/report.html -- %h/bin/report.sh # ~/.config/systemd/user/nightly-report.timer [Timer] OnCalendar=*-*-* 02:00 Persistent=true [Install] WantedBy=timers.target
rv fails open: if RunVouch is unreachable the job still runs and you get one warning line.
Register the cadence and caps
rv agent nightly-report --cadence 24h --grace 30m --max-runtime 1h --evidence --cap-run-cost 2
Register the agent once, from anywhere with the key. Cadence is what turns a schedule that stopped into an alert; --evidence makes a run without evidence a failure; the caps pause the agent when it overspends.
What goes silent on systemd timers
- Without
Persistent=truea timer that was due while the machine was off is simply skipped. OnFailure=can start a notifier unit, but only on non-zero exit; a script that exits 0 with no output is never a failure to systemd.- User timers stop when the user session ends unless
loginctl enable-lingeris set; MISSED tells you the same evening, not when you next log in.
What RunVouch detects
| Alert | What it means here |
|---|---|
| MISSED | cadence plus grace passed and no run started |
| FAILED | non-zero exit or a reported failure, with the stderr excerpt |
| NO_EVIDENCE | the run said ok but the file, URL or assertion you required is missing |
| STALLED | a run started and never ended within max runtime |
| RETRY_STORM | the same tool called with identical input many times in one run |
| BUDGET_RUN / BUDGET_DAY | cost cap crossed; the agent is paused until you resume it |
| DRIFT | duration or output size far off its 7-run baseline |
Need a key? Get a free key · Stuck? contact